mirror of
https://github.com/jeremytammik/RevitSdkSamples.git
synced 2026-09-12 06:22:01 +00:00
added Revit 2022 SDK minus except *rvt and *rfa
This commit is contained in:
@@ -0,0 +1,152 @@
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Windows.Forms;
|
||||
|
||||
namespace Revit.SDK.Samples.RebarFreeForm.CS
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the Revit add-in interface IExternalCommand
|
||||
/// </summary>
|
||||
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
|
||||
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
|
||||
public class AddSharedParams : IExternalCommand
|
||||
{
|
||||
/// <summary>
|
||||
/// Updated: is used to start the regeneration
|
||||
/// </summary>
|
||||
public static string m_paramName = "Updated";
|
||||
/// <summary>
|
||||
/// CurveElementId: is used to store the id of a model curve
|
||||
/// </summary>
|
||||
public static string m_CurveIdName = "CurveElementId";
|
||||
/// <summary>
|
||||
/// Add two shared parameters to the rebar category instance elements:
|
||||
/// Updated: is used to start the regeneration
|
||||
/// CurveElementId: is used to store the id of a model curve
|
||||
/// </summary>
|
||||
public virtual Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
|
||||
{
|
||||
try
|
||||
{
|
||||
Document doc = commandData.Application.ActiveUIDocument.Document;
|
||||
if (doc == null)
|
||||
return Result.Failed;
|
||||
using (Transaction tran = new Transaction(doc, "Add shared param"))
|
||||
{
|
||||
tran.Start();
|
||||
bool paramsAdded = AddSharedTestParameter(commandData, m_paramName, SpecTypeId.Boolean.YesNo, false);
|
||||
paramsAdded &= AddSharedTestParameter(commandData, m_CurveIdName, SpecTypeId.Int.Integer, true);
|
||||
if (paramsAdded)
|
||||
{
|
||||
tran.Commit();
|
||||
return Result.Succeeded;
|
||||
}
|
||||
tran.RollBack();
|
||||
return Result.Failed;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
return Result.Failed;
|
||||
}
|
||||
}
|
||||
|
||||
private bool AddSharedTestParameter(ExternalCommandData commandData, string paramName, ForgeTypeId paramType, bool userModifiable)
|
||||
{
|
||||
try
|
||||
{
|
||||
// check whether shared parameter exists
|
||||
if (ShareParameterExists(commandData.Application.ActiveUIDocument.Document, paramName))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
// create shared parameter file
|
||||
String modulePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
|
||||
String paramFile = modulePath + "\\RebarTestParameters.txt";
|
||||
if (File.Exists(paramFile))
|
||||
{
|
||||
File.Delete(paramFile);
|
||||
}
|
||||
FileStream fs = File.Create(paramFile);
|
||||
fs.Close();
|
||||
|
||||
// cache application handle
|
||||
Autodesk.Revit.ApplicationServices.Application revitApp = commandData.Application.Application;
|
||||
|
||||
// prepare shared parameter file
|
||||
commandData.Application.Application.SharedParametersFilename = paramFile;
|
||||
|
||||
// open shared parameter file
|
||||
DefinitionFile parafile = revitApp.OpenSharedParameterFile();
|
||||
|
||||
// create a group
|
||||
DefinitionGroup apiGroup = parafile.Groups.Create("RebarTestParamGroup");
|
||||
|
||||
// create a visible param
|
||||
ExternalDefinitionCreationOptions ExtDefinitionCreationOptions = new ExternalDefinitionCreationOptions(paramName, paramType);
|
||||
ExtDefinitionCreationOptions.HideWhenNoValue = true;//used this to show the parameter only in some rebar instances that will use it
|
||||
ExtDefinitionCreationOptions.UserModifiable = userModifiable;// set if users need to modify this
|
||||
Definition rebarSharedParamDef = apiGroup.Definitions.Create(ExtDefinitionCreationOptions);
|
||||
|
||||
// get rebar category
|
||||
Category rebarCat = commandData.Application.ActiveUIDocument.Document.Settings.Categories.get_Item(BuiltInCategory.OST_Rebar);
|
||||
CategorySet categories = revitApp.Create.NewCategorySet();
|
||||
categories.Insert(rebarCat);
|
||||
|
||||
// insert the new parameter
|
||||
InstanceBinding binding = revitApp.Create.NewInstanceBinding(categories);
|
||||
commandData.Application.ActiveUIDocument.Document.ParameterBindings.Insert(rebarSharedParamDef, binding);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception("Failed to create shared parameter: " + ex.Message);
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Checks if a parameter exists based of a name
|
||||
/// </summary>
|
||||
/// <param name="doc"></param>
|
||||
/// <param name="paramName"></param>
|
||||
/// <returns></returns>
|
||||
private bool ShareParameterExists(Document doc, String paramName)
|
||||
{
|
||||
BindingMap bindingMap = doc.ParameterBindings;
|
||||
DefinitionBindingMapIterator iter = bindingMap.ForwardIterator();
|
||||
iter.Reset();
|
||||
|
||||
while (iter.MoveNext())
|
||||
{
|
||||
Definition tempDefinition = iter.Key;
|
||||
|
||||
// find the definition of which the name is the appointed one
|
||||
if (String.Compare(tempDefinition.Name, paramName) != 0)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// get the category which is bound
|
||||
ElementBinding binding = bindingMap.get_Item(tempDefinition) as ElementBinding;
|
||||
CategorySet bindCategories = binding.Categories;
|
||||
foreach (Category category in bindCategories)
|
||||
{
|
||||
if (category.Name
|
||||
== doc.Settings.Categories.get_Item(BuiltInCategory.OST_Rebar).Name)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,87 @@
|
||||
//
|
||||
// (C) Copyright 2003-2016 by Autodesk, Inc. All rights reserved.
|
||||
//
|
||||
// Permission to use, copy, modify, and distribute this software in
|
||||
// object code form for any purpose and without fee is hereby granted
|
||||
// provided that the above copyright notice appears in all copies and
|
||||
// that both that copyright notice and the limited warranty and
|
||||
// restricted rights notice below appear in all supporting
|
||||
// documentation.
|
||||
//
|
||||
// AUTODESK PROVIDES THIS PROGRAM 'AS IS' AND WITH ALL ITS FAULTS.
|
||||
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
|
||||
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
|
||||
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
|
||||
// UNINTERRUPTED OR ERROR FREE.
|
||||
//
|
||||
// Use, duplication, or disclosure by the U.S. Government is subject to
|
||||
// restrictions set forth in FAR 52.227-19 (Commercial Computer
|
||||
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
|
||||
// (Rights in Technical Data and Computer Software), as applicable.
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Windows.Forms;
|
||||
using System.IO;
|
||||
|
||||
using Autodesk;
|
||||
using Autodesk.Revit;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.UI;
|
||||
using Autodesk.Revit.ApplicationServices;
|
||||
using Autodesk.Revit.DB.ExternalService;
|
||||
using Autodesk.Revit.DB.Structure;
|
||||
|
||||
namespace Revit.SDK.Samples.RebarFreeForm.CS
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the Revit add-in interface IExternalApplication
|
||||
/// </summary>
|
||||
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
|
||||
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
|
||||
public class Application : IExternalApplication
|
||||
{
|
||||
#region IExternalApplication Members
|
||||
|
||||
RebarUpdateServer m_server = new RebarUpdateServer();
|
||||
|
||||
#endregion
|
||||
|
||||
#region IExternalApplication Interface Implementation
|
||||
/// <summary>
|
||||
/// Implements the OnShutdown event
|
||||
/// </summary>
|
||||
/// <param name="application"></param>
|
||||
/// <returns></returns>
|
||||
public Result OnShutdown(UIControlledApplication application)
|
||||
{
|
||||
return Result.Succeeded;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Implements the OnStartup event
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="application"></param>
|
||||
/// <returns></returns>
|
||||
public Result OnStartup(UIControlledApplication application)
|
||||
{
|
||||
// Register CurveElement updater with revit to trigger regen in rebar for selected lines
|
||||
CurveElementRegenUpdater updater = new CurveElementRegenUpdater(application.ActiveAddInId);
|
||||
UpdaterRegistry.RegisterUpdater(updater);
|
||||
ElementClassFilter modelLineFilter = new ElementClassFilter(typeof(CurveElement));
|
||||
UpdaterRegistry.AddTrigger(updater.GetUpdaterId(), modelLineFilter, Element.GetChangeTypeAny());
|
||||
|
||||
//Register the RebarUpdateServer
|
||||
ExternalService service = ExternalServiceRegistry.GetService(m_server.GetServiceId());
|
||||
if (service != null)
|
||||
{
|
||||
service.AddServer(m_server);
|
||||
return Result.Succeeded;
|
||||
}
|
||||
return Result.Succeeded;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,178 @@
|
||||
//
|
||||
// (C) Copyright 2003-2016 by Autodesk, Inc. All rights reserved.
|
||||
//
|
||||
// Permission to use, copy, modify, and distribute this software in
|
||||
// object code form for any purpose and without fee is hereby granted
|
||||
// provided that the above copyright notice appears in all copies and
|
||||
// that both that copyright notice and the limited warranty and
|
||||
// restricted rights notice below appear in all supporting
|
||||
// documentation.
|
||||
//
|
||||
// AUTODESK PROVIDES THIS PROGRAM 'AS IS' AND WITH ALL ITS FAULTS.
|
||||
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
|
||||
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
|
||||
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
|
||||
// UNINTERRUPTED OR ERROR FREE.
|
||||
//
|
||||
// Use, duplication, or disclosure by the U.S. Government is subject to
|
||||
// restrictions set forth in FAR 52.227-19 (Commercial Computer
|
||||
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
|
||||
// (Rights in Technical Data and Computer Software), as applicable.
|
||||
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.DB.Structure;
|
||||
using Autodesk.Revit.UI;
|
||||
using Autodesk.Revit.UI.Selection;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace Revit.SDK.Samples.RebarFreeForm.CS
|
||||
{
|
||||
/// <summary>
|
||||
/// Implements the Revit add-in interface IExternalCommand
|
||||
/// </summary>
|
||||
[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
|
||||
[Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
|
||||
public class Command : IExternalCommand
|
||||
{
|
||||
/// <summary>
|
||||
/// Implement this method as an external command for Revit.
|
||||
/// </summary>
|
||||
/// <param name="commandData">An object that is passed to the external application
|
||||
/// which contains data related to the command,
|
||||
/// such as the application object and active view.</param>
|
||||
/// <param name="message">A message that can be set by the external application
|
||||
/// which will be displayed if a failure or cancellation is returned by
|
||||
/// the external command.</param>
|
||||
/// <param name="elements">A set of elements to which the external application
|
||||
/// can add elements that are to be highlighted in case of failure or cancellation.</param>
|
||||
/// <returns>Return the status of the external command.
|
||||
/// A result of Succeeded means that the API external method functioned as expected.
|
||||
/// Cancelled can be used to signify that the user cancelled the external operation
|
||||
/// at some point. Failure should be returned if the application is unable to proceed with
|
||||
/// the operation.</returns>
|
||||
public virtual Result Execute(ExternalCommandData commandData
|
||||
, ref string message, ElementSet elements)
|
||||
{
|
||||
try
|
||||
{
|
||||
Document doc = commandData.Application.ActiveUIDocument.Document;
|
||||
if (doc == null)
|
||||
return Result.Failed;
|
||||
|
||||
//Fetch a RebarBarType element to be used in Rebar creation.
|
||||
FilteredElementCollector fec = new FilteredElementCollector(doc).OfClass(typeof(RebarBarType));
|
||||
if (fec.GetElementCount() <= 0)
|
||||
return Result.Failed;
|
||||
RebarBarType barType = fec.FirstElement() as RebarBarType;
|
||||
Rebar rebar = null;
|
||||
CurveElement curveElem = null;
|
||||
using (Transaction tran = new Transaction(doc, "Create Rebar"))
|
||||
{
|
||||
Element host = null;
|
||||
Selection sel = commandData.Application.ActiveUIDocument.Selection;
|
||||
try
|
||||
{
|
||||
//Select structural Host.
|
||||
Reference hostRef = sel.PickObject(ObjectType.Element, "Select Host");
|
||||
host = doc.GetElement(hostRef.ElementId);
|
||||
if (host == null)
|
||||
return Result.Failed;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
message = e.Message;
|
||||
return Result.Failed;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
//Select curve element
|
||||
Reference lineRef = sel.PickObject(ObjectType.Element, "Select Model curve");
|
||||
curveElem = doc.GetElement(lineRef.ElementId) as CurveElement;
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
curveElem = null;
|
||||
}
|
||||
|
||||
tran.Start();
|
||||
|
||||
// Create Rebar Free Form by specifying the GUID defining the custom external server.
|
||||
// The Rebar element returned needs to receive constraints, so that regeneration can
|
||||
// call the custom geometry calculations and create the bars
|
||||
rebar = Rebar.CreateFreeForm(doc, RebarUpdateServer.SampleGuid, barType, host);
|
||||
// Get all bar handles to set constraints to them, so that the bar can generate its geometry
|
||||
RebarConstraintsManager rManager = rebar.GetRebarConstraintsManager();
|
||||
IList<RebarConstrainedHandle> handles = rManager.GetAllHandles();
|
||||
|
||||
// if bar has no handles then the server can't generate rebar geometry
|
||||
if (handles.Count <= 0)
|
||||
{
|
||||
tran.RollBack();
|
||||
return Result.Failed;
|
||||
}
|
||||
|
||||
// iterate through the rebar handles and prompt for face selection for each of them, to get user input
|
||||
foreach (RebarConstrainedHandle handle in handles)
|
||||
{
|
||||
if (handle.GetHandleType() == RebarHandleType.StartOfBar ||
|
||||
handle.GetHandleType() == RebarHandleType.EndOfBar)
|
||||
continue;// Start handle and end handle will receive constraints from the custom external server execution
|
||||
try
|
||||
{
|
||||
Reference reference = sel.PickObject(ObjectType.Face, "Select face for " + handle.GetHandleName());
|
||||
if (reference == null)
|
||||
continue;
|
||||
// create constraint using the picked faces and set it to the associated handle
|
||||
List<Reference> refs = new List<Reference>();
|
||||
refs.Add(reference);
|
||||
RebarConstraint constraint = RebarConstraint.Create(handle, refs, true, 0.0);
|
||||
rManager.SetPreferredConstraintForHandle(handle, constraint);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
message = e.Message;
|
||||
tran.RollBack();
|
||||
return Result.Cancelled;
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
//here we add a value to the shared parameter and add it to the regeneration dependencies
|
||||
Parameter newSharedParam = rebar.LookupParameter(AddSharedParams.m_paramName);
|
||||
Parameter newSharedParam2 = rebar.LookupParameter(AddSharedParams.m_CurveIdName);
|
||||
if (newSharedParam != null && newSharedParam2 != null)
|
||||
{
|
||||
newSharedParam.Set(0);
|
||||
newSharedParam2.Set(curveElem == null ? -1 : curveElem.Id.IntegerValue);
|
||||
|
||||
RebarFreeFormAccessor accesRebar = rebar.GetFreeFormAccessor();
|
||||
accesRebar.AddUpdatingSharedParameter(newSharedParam.Id);
|
||||
accesRebar.AddUpdatingSharedParameter(newSharedParam2.Id);
|
||||
}
|
||||
else
|
||||
{
|
||||
// The AddSharedParams command should be executed to create and bind these parameters to rebar.
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
message = ex.Message;
|
||||
tran.RollBack();
|
||||
return Result.Cancelled;
|
||||
}
|
||||
tran.Commit();
|
||||
return Result.Succeeded;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
message = ex.Message;
|
||||
return Result.Failed;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
using System;
|
||||
using Autodesk.Revit.DB;
|
||||
using RvtUpdaterId = Autodesk.Revit.DB.UpdaterId;
|
||||
using RvtAddinId = Autodesk.Revit.DB.AddInId;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Windows.Forms;
|
||||
using Autodesk.Revit.DB.Structure;
|
||||
using System.Collections.ObjectModel;
|
||||
|
||||
namespace Revit.SDK.Samples.RebarFreeForm.CS
|
||||
{
|
||||
/// <summary>
|
||||
/// This updater is used to regen rebar elements whenever a curveElement that was "Selected" is changed
|
||||
/// </summary>
|
||||
class CurveElementRegenUpdater : IUpdater
|
||||
{
|
||||
static AddInId m_appId;
|
||||
static UpdaterId m_updaterId;
|
||||
|
||||
public CurveElementRegenUpdater(AddInId id)
|
||||
{
|
||||
m_appId = id;
|
||||
m_updaterId = new UpdaterId(m_appId, new Guid("0935FACA-29B6-468A-95E1-D121BEE58B62"));
|
||||
}
|
||||
public void Execute(UpdaterData data)
|
||||
{
|
||||
try
|
||||
{
|
||||
ICollection<ElementId> modifiedIds = data.GetModifiedElementIds();
|
||||
if (modifiedIds.Count > 0)// if any curveElement was modified
|
||||
{
|
||||
//get all rebar elements anf filter them, to see which need to be notified of the change
|
||||
FilteredElementCollector collector = new FilteredElementCollector(data.GetDocument());
|
||||
IList<Element> elemBars = collector.OfClass(typeof(Rebar)).ToElements();
|
||||
foreach (Element elem in elemBars)
|
||||
{
|
||||
Rebar bar = elem as Rebar;
|
||||
if (bar == null)
|
||||
continue;
|
||||
if (!bar.IsRebarFreeForm())// only need free form bars
|
||||
continue;
|
||||
RebarFreeFormAccessor barAccess = bar.GetFreeFormAccessor();
|
||||
if (!barAccess.GetServerGUID().Equals(RebarUpdateServer.SampleGuid))// only use our custom FreeForm
|
||||
continue;
|
||||
Parameter paramCurveId = bar.LookupParameter(AddSharedParams.m_CurveIdName);
|
||||
if (paramCurveId == null)
|
||||
continue;
|
||||
ElementId id = new ElementId(paramCurveId.AsInteger());
|
||||
if (id == ElementId.InvalidElementId)
|
||||
continue;
|
||||
if (modifiedIds.Contains(id))// if id of line is in the rebar, then trigger regen
|
||||
{
|
||||
var param = bar.LookupParameter(AddSharedParams.m_paramName);
|
||||
param.Set(param.AsInteger() == 0 ? 1 : 0);// just flip the value to register a change that will trigger the regeneration of that rebar on commit.
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
MessageBox.Show(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
public string GetAdditionalInformation()
|
||||
{
|
||||
return "this is a sample updater that reacts to changing model lines to change the rebar connected to it";
|
||||
}
|
||||
|
||||
public ChangePriority GetChangePriority()
|
||||
{
|
||||
return ChangePriority.Structure;
|
||||
}
|
||||
|
||||
public UpdaterId GetUpdaterId()
|
||||
{
|
||||
return m_updaterId;
|
||||
}
|
||||
|
||||
public string GetUpdaterName()
|
||||
{
|
||||
return "Line change updater";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
//
|
||||
// (C) Copyright 2003-2016 by Autodesk, Inc.
|
||||
//
|
||||
// Permission to use, copy, modify, and distribute this software in
|
||||
// object code form for any purpose and without fee is hereby granted,
|
||||
// provided that the above copyright notice appears in all copies and
|
||||
// that both that copyright notice and the limited warranty and
|
||||
// restricted rights notice below appear in all supporting
|
||||
// documentation.
|
||||
//
|
||||
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
|
||||
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
|
||||
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
|
||||
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
|
||||
// UNINTERRUPTED OR ERROR FREE.
|
||||
//
|
||||
// Use, duplication, or disclosure by the U.S. Government is subject to
|
||||
// restrictions set forth in FAR 52.227-19 (Commercial Computer
|
||||
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
|
||||
// (Rights in Technical Data and Computer Software), as applicable.
|
||||
//
|
||||
|
||||
using System.Reflection;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("RebarFreeForm")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("")]
|
||||
[assembly: AssemblyCopyright("Copyright © Autodesk, Inc. 2016")]
|
||||
[assembly: AssemblyTrademark("")]
|
||||
[assembly: AssemblyCulture("")]
|
||||
|
||||
// Setting ComVisible to false makes the types in this assembly not visible
|
||||
// to COM components. If you need to access a type in this assembly from
|
||||
// COM, set the ComVisible attribute to true on that type.
|
||||
[assembly: ComVisible(false)]
|
||||
|
||||
// The following GUID is for the ID of the typelib if this project is exposed to COM
|
||||
[assembly: Guid("ba1a2d34-7383-4393-89f1-b141d09cdc00")]
|
||||
|
||||
// Version information for an assembly consists of the following four values:
|
||||
//
|
||||
// Major Version
|
||||
// Minor Version
|
||||
// Build Number
|
||||
// Revision
|
||||
//
|
||||
[assembly: AssemblyVersion("1.0.0.0")]
|
||||
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||
@@ -0,0 +1,290 @@
|
||||
{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff0\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi0\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
|
||||
{\f34\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||
{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0302020204030204}Calibri Light;}
|
||||
{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}
|
||||
{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}
|
||||
{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f43\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f44\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\f46\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f47\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f48\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f49\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\f50\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f51\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f53\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f54\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;}
|
||||
{\f56\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f57\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f58\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f59\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);}
|
||||
{\f60\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f61\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\f383\fbidi \froman\fcharset238\fprq2 Cambria Math CE;}{\f384\fbidi \froman\fcharset204\fprq2 Cambria Math Cyr;}
|
||||
{\f386\fbidi \froman\fcharset161\fprq2 Cambria Math Greek;}{\f387\fbidi \froman\fcharset162\fprq2 Cambria Math Tur;}{\f390\fbidi \froman\fcharset186\fprq2 Cambria Math Baltic;}{\f391\fbidi \froman\fcharset163\fprq2 Cambria Math (Vietnamese);}
|
||||
{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
|
||||
{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||
{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
|
||||
{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \fswiss\fcharset238\fprq2 Calibri Light CE;}{\fhimajor\f31529\fbidi \fswiss\fcharset204\fprq2 Calibri Light Cyr;}
|
||||
{\fhimajor\f31531\fbidi \fswiss\fcharset161\fprq2 Calibri Light Greek;}{\fhimajor\f31532\fbidi \fswiss\fcharset162\fprq2 Calibri Light Tur;}{\fhimajor\f31533\fbidi \fswiss\fcharset177\fprq2 Calibri Light (Hebrew);}
|
||||
{\fhimajor\f31534\fbidi \fswiss\fcharset178\fprq2 Calibri Light (Arabic);}{\fhimajor\f31535\fbidi \fswiss\fcharset186\fprq2 Calibri Light Baltic;}{\fhimajor\f31536\fbidi \fswiss\fcharset163\fprq2 Calibri Light (Vietnamese);}
|
||||
{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}
|
||||
{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}
|
||||
{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}
|
||||
{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}
|
||||
{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}
|
||||
{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||
{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}
|
||||
{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;}{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}
|
||||
{\fhiminor\f31573\fbidi \fswiss\fcharset177\fprq2 Calibri (Hebrew);}{\fhiminor\f31574\fbidi \fswiss\fcharset178\fprq2 Calibri (Arabic);}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}
|
||||
{\fhiminor\f31576\fbidi \fswiss\fcharset163\fprq2 Calibri (Vietnamese);}{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}
|
||||
{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}
|
||||
{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}
|
||||
{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
|
||||
\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red0\green0\blue0;\red0\green0\blue0;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap
|
||||
\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{\ql \li0\ri0\sa160\sl259\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1
|
||||
\af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\*
|
||||
\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa160\sl259\slmult1
|
||||
\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 \snext11 \ssemihidden \sunhideused
|
||||
Normal Table;}}{\*\rsidtbl \rsid1380938\rsid1384622\rsid1736421\rsid3279877\rsid4270572\rsid5002119\rsid5314467\rsid5995320\rsid6056221\rsid6098998\rsid6711664\rsid7938026\rsid7960507\rsid8155750\rsid8260431\rsid8668673\rsid9446006\rsid9989722
|
||||
\rsid10291755\rsid10844741\rsid10974369\rsid11085672\rsid11226105\rsid13585980\rsid14688207\rsid16075007}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info
|
||||
{\author Alexandru Lacatusu}{\operator Stefan Dobre}{\creatim\yr2018\mo1\dy17\hr15\min40}{\revtim\yr2020\mo7\dy17\hr22\min4}{\version20}{\edmins1423}{\nofpages2}{\nofwords472}{\nofchars2693}{\nofcharsws3159}{\vern111}}{\*\xmlnstbl {\xmlns1 http://schemas.
|
||||
microsoft.com/office/word/2003/wordml}}\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect
|
||||
\widowctrl\ftnbj\aenddoc\trackmoves0\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701
|
||||
\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot9446006 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2
|
||||
\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6
|
||||
\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang
|
||||
{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 \rtlch\fcs1 \af0\afs22\alang1025 \ltrch\fcs0
|
||||
\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Application:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 RebarFreeForm\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Revit Platform:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877
|
||||
\hich\af1\dbch\af31505\loch\f1 All\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Revit Version:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 2018.0
|
||||
\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 First Released For:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 2018.0\line }{\rtlch\fcs1 \ab\af1\afs20
|
||||
\ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Programming Language:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 C#\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0
|
||||
\b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Skill Level:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Advanced\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877
|
||||
\hich\af1\dbch\af31505\loch\f1 Category:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Structure\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Type:}{
|
||||
\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid10844741 \hich\af1\dbch\af31505\loch\f1 ExternalCommand,}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 ExternalApplication}{\rtlch\fcs1 \af1\afs20
|
||||
\ltrch\fcs0 \f1\fs20\insrsid10844741 \hich\af1\dbch\af31505\loch\f1 and IUpdater}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \line \line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1
|
||||
Subject:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Rebar Free Form\line }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Summary:}{\rtlch\fcs1 \af1\afs20
|
||||
\ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 \line External command to create a Rebar FreeForm element and external application to implement the custom server used to regenerate the reb\hich\af1\dbch\af31505\loch\f1
|
||||
ar geometry based on constraints}{\rtlch\fcs1 \ai\af0\afs20 \ltrch\fcs0 \i\f0\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \f0\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Classes:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid4270572
|
||||
\par \hich\af1\dbch\af31505\loch\f1 RebarUpdateServer
|
||||
\par \hich\af1\dbch\af31505\loch\f1 Application
|
||||
\par \hich\af1\dbch\af31505\loch\f1 Command}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572\charrsid4270572
|
||||
\par }\pard \ltrpar\qj \fi180\li180\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin180\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid4270572\charrsid6098998 \hich\af1\dbch\af31505\loch\f1 TargetFace}{
|
||||
\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid3279877\charrsid6098998
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid1736421 \hich\af1\dbch\af31505\loch\f1 CurveElement}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid6098998\charrsid6098998
|
||||
\hich\af1\dbch\af31505\loch\f1 RegenUpdater}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid4270572\charrsid6098998
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid6098998\charrsid6098998 \hich\af1\dbch\af31505\loch\f1 AddSharedParams
|
||||
\par }{\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \f0\fs20\lang1036\langfe1033\langnp1036\insrsid6098998
|
||||
\par
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Project Files:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \ai\af1\afs20 \ltrch\fcs0 \i\f1\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877\charrsid9446006 \hich\af1\dbch\af31505\loch\f1 Command.cs
|
||||
\par }\pard \ltrpar\qj \li360\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877\charrsid9446006 \hich\af1\dbch\af31505\loch\f1
|
||||
It contains the class Command which inherits from interface IExternalCommand and implement}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid9446006 \hich\af1\dbch\af31505\loch\f1 s the Execute method to create the }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid4270572 \hich\af1\dbch\af31505\loch\f1 custom rebar.}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572 \hich\af1\dbch\af31505\loch\f1 Application.cs}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid9446006
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572 \hich\af1\dbch\af31505\loch\f1 It contains the class Application which inherits from interface IExternalApplication and implement\hich\af1\dbch\af31505\loch\f1 s the
|
||||
\par \hich\af1\dbch\af31505\loch\f1 OnStartup and OnShutdown methods to manage the custom }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572\charrsid4270572 \hich\af1\dbch\af31505\loch\f1 IRebarUpdateServer}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid4270572 .
|
||||
\par \hich\af1\dbch\af31505\loch\f1 RebarUpdateServer.cs
|
||||
\par }\pard \ltrpar\qj \li360\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572 \hich\af1\dbch\af31505\loch\f1
|
||||
It contains the Class RebarUpdateServer which inherits from interface IRebarUpdateServer and \hich\af1\dbch\af31505\loch\f1 implements the functions needed to }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11085672
|
||||
\hich\af1\dbch\af31505\loch\f1 define}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid16075007 \hich\af1\dbch\af31505\loch\f1 and }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572 \hich\af1\dbch\af31505\loch\f1 calculate a custom rebar.}{
|
||||
\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid4270572\charrsid9446006
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid5314467 \hich\af1\dbch\af31505\loch\f1 CurveElement}{\rtlch\fcs1 \af1\afs20
|
||||
\ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid5314467\charrsid6098998 \hich\af1\dbch\af31505\loch\f1 RegenUpdater}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid6098998\charrsid6098998
|
||||
\hich\af1\dbch\af31505\loch\f1 .cs
|
||||
\par }\pard \ltrpar\ql \fi180\li180\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin180\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid6098998\charrsid6098998 \hich\af1\dbch\af31505\loch\f1
|
||||
It contains the class }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid9989722 \hich\af1\dbch\af31505\loch\f1 CurveElement}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\lang1036\langfe1033\langnp1036\insrsid9989722\charrsid6098998 \hich\af1\dbch\af31505\loch\f1 RegenUpdater}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid9989722 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1
|
||||
\af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid6098998\charrsid6098998 \hich\af1\dbch\af31505\loch\f1 which inherits from interface}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid6098998
|
||||
\hich\af1\dbch\af31505\loch\f1 IUpdater, and}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid13585980 \hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid13585980 \hich\af1\dbch\af31505\loch\f1 implements the notification of rebars connected to the curve elements}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\lang1036\langfe1033\langnp1036\insrsid13585980 \hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid7960507\charrsid6098998 \hich\af1\dbch\af31505\loch\f1 AddSharedParams}{
|
||||
\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid7960507 \hich\af1\dbch\af31505\loch\f1 .cs}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\lang1036\langfe1033\langnp1036\insrsid3279877
|
||||
\par }\pard \ltrpar\qj \li360\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin360\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid7960507\charrsid9446006 \hich\af1\dbch\af31505\loch\f1
|
||||
It contains the class Command which inherits from interface IExternalCommand and implement}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid7960507 \hich\af1\dbch\af31505\loch\f1 s the creation }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid6056221 \hich\af1\dbch\af31505\loch\f1 and binding, }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid7960507 \hich\af1\dbch\af31505\loch\f1 of the two sha\hich\af1\dbch\af31505\loch\f1 red params used in the rebar regeneration
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \f0\fs20\lang1036\langfe1033\langnp1036\insrsid7960507
|
||||
\par }{\rtlch\fcs1 \ab\af0\afs20 \ltrch\fcs0 \b\f0\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Description:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af0\afs20 \ltrch\fcs0
|
||||
\f0\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877\charrsid16075007 \hich\af1\dbch\af31505\loch\f1 This sample provides following functionalities.
|
||||
\par }\pard \ltrpar\qj \fi-360\li360\ri0\nowidctlpar\tx360\wrapdefault\faauto\rin0\lin360\itap0\pararsid13585980 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877\charrsid16075007 -\tab \hich\af1\dbch\af31505\loch\f1 Let user create }{\rtlch\fcs1
|
||||
\af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid16075007 \hich\af1\dbch\af31505\loch\f1 a custom Rebar FreeForm}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5002119 \hich\af1\dbch\af31505\loch\f1 b}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid16075007 \hich\af1\dbch\af31505\loch\f1 y selecting 3 structural faces in the model. This generates a set of variable length bars between the inter\hich\af1\dbch\af31505\loch\f1
|
||||
sections of 3 faces (face1 x face2 and face 1x face3 ) that automatically adjusts their length to the closest structural face. }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid8155750 \hich\af1\dbch\af31505\loch\f1 - \tab Lets the user select a }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid14688207 \hich\af1\dbch\af31505\loch\f1
|
||||
curve element form the model and use that curve t}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11226105 \hich\af1\dbch\af31505\loch\f1 o generate bar geometry in place of the curves result\hich\af1\dbch\af31505\loch\f1 ing from the intersection}{
|
||||
\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid14688207
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid16075007 \hich\af1\dbch\af31505\loch\f1 - It implements the IRebarUpdateServer interface to define the bar\hich\f1 \rquote \loch\f1 s behavior in the constraint framework}{\rtlch\fcs1 \af1\afs20
|
||||
\ltrch\fcs0 \f1\fs20\insrsid5002119 \hich\af1\dbch\af31505\loch\f1 . It defines the bar\hich\f1 \rquote \hich\af1\dbch\af31505\loch\f1 s handles information, the generation of the bars based on the input faces.}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid16075007\charrsid16075007
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \f0\fs20\insrsid3279877
|
||||
\par }{\rtlch\fcs1 \ab\af1\afs20 \ltrch\fcs0 \b\f1\fs20\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 Instructions:}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\cf2\insrsid3279877 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af0\afs20 \ltrch\fcs0
|
||||
\f0\fs20\cf2\insrsid3279877
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid1380938 {\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5002119\charrsid11085672 \hich\af1\dbch\af31505\loch\f1
|
||||
To create this type of rebar, open Revit application with the addon installed, and }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid8260431 \hich\af1\dbch\af31505\loch\f1 lunch}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid5002119\charrsid11085672 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid8260431 \loch\af1\dbch\af31505\hich\f1 \'93\hich\af1\dbch\af31505\loch\f1 Add param\hich\af1\dbch\af31505\loch\f1 eters
|
||||
\loch\af1\dbch\af31505\hich\f1 \'94\hich\af1\dbch\af31505\loch\f1 command.\hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 It \hich\af1\dbch\af31505\loch\f1 will create the shared pa\hich\af1\dbch\af31505\loch\f1 ram
|
||||
\hich\af1\dbch\af31505\loch\f1 e\hich\af1\dbch\af31505\loch\f1 ters \hich\af1\dbch\af31505\loch\f1 and will bind \hich\af1\dbch\af31505\loch\f1 them to \hich\af1\dbch\af31505\loch\f1 rebar eleme\hich\af1\dbch\af31505\loch\f1 n
|
||||
\hich\af1\dbch\af31505\loch\f1 t\hich\af1\dbch\af31505\loch\f1 s\hich\af1\dbch\af31505\loch\f1 . Now \hich\af1\dbch\af31505\loch\f1 lunch the \loch\af1\dbch\af31505\hich\f1 \'93}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid8260431\charrsid8260431
|
||||
\hich\af1\dbch\af31505\loch\f1 Create Rebar Free Form}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid8260431 \loch\af1\dbch\af31505\hich\f1 \'94\hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid6711664
|
||||
\hich\af1\dbch\af31505\loch\f1 command.\hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 It }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid8260431 \hich\af1\dbch\af31505\loch\f1 will c}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0
|
||||
\f1\fs20\insrsid5002119\charrsid11085672 \hich\af1\dbch\af31505\loch\f1 reate a rebar by selecting one face for each rebar hand\hich\af1\dbch\af31505\loch\f1 le}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid11085672 \hich\af1\dbch\af31505\loch\f1 }
|
||||
{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5002119\charrsid11085672 \hich\af1\dbch\af31505\loch\f1 (first, second, third handle).}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid1380938\charrsid11085672 \hich\af1\dbch\af31505\loch\f1 }{
|
||||
\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5002119\charrsid11085672 \hich\af1\dbch\af31505\loch\f1
|
||||
The first bar will be calculated at the intersection of the first and second faces. If the layout is not single, the last bar will be at the intersection of the first and third face. The rest of the bars in the set will be distributed evenly between th
|
||||
\hich\af1\dbch\af31505\loch\f1 e first and last bar.}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid1380938\charrsid1380938 \hich\af1\dbch\af31505\loch\f1 }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid1380938\charrsid11085672
|
||||
\hich\af1\dbch\af31505\loch\f1 If the selected faces are not planar, and if the resulting intersection is not a straight line, the \hich\af1\dbch\af31505\loch\f1 bar will issue a Can\hich\f1 \rquote \hich\af1\dbch\af31505\loch\f1
|
||||
t solve rebar shape warning.}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid1380938
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid1380938 \hich\af1\dbch\af31505\loch\f1 Select a \hich\af1\dbch\af31505\loch\f1 C\hich\af1\dbch\af31505\loch\f1 urve\hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 Element
|
||||
\hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 (model lines, arcs, etc) to have it\hich\af1\dbch\af31505\loch\f1 s geometry used as bar geometry\hich\af1\dbch\af31505\loch\f1 \hich\af1\dbch\af31505\loch\f1 (optional).}{\rtlch\fcs1
|
||||
\af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid1380938
|
||||
\par }{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5002119\charrsid11085672 \hich\af1\dbch\af31505\loch\f1 The rebar\hich\f1 \rquote \loch\f1 s constraints can be changed by selecting the bar and entering the Edit Constraints mode.
|
||||
\par }\pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0\pararsid13585980 {\rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \f0\fs20\insrsid3279877
|
||||
\par }{\*\themedata 504b030414000600080000002100e9de0fbfff0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb4ec3301045f748fc83e52d4a
|
||||
9cb2400825e982c78ec7a27cc0c8992416c9d8b2a755fbf74cd25442a820166c2cd933f79e3be372bd1f07b5c3989ca74aaff2422b24eb1b475da5df374fd9ad
|
||||
5689811a183c61a50f98f4babebc2837878049899a52a57be670674cb23d8e90721f90a4d2fa3802cb35762680fd800ecd7551dc18eb899138e3c943d7e503b6
|
||||
b01d583deee5f99824e290b4ba3f364eac4a430883b3c092d4eca8f946c916422ecab927f52ea42b89a1cd59c254f919b0e85e6535d135a8de20f20b8c12c3b0
|
||||
0c895fcf6720192de6bf3b9e89ecdbd6596cbcdd8eb28e7c365ecc4ec1ff1460f53fe813d3cc7f5b7f020000ffff0300504b030414000600080000002100a5d6
|
||||
a7e7c0000000360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4f
|
||||
c7060abb0884a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b6309512
|
||||
0f88d94fbc52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462
|
||||
a1a82fe353bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f746865
|
||||
6d652f7468656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b
|
||||
4b0d592c9c070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b
|
||||
4757e8d3f729e245eb2b260a0238fd010000ffff0300504b030414000600080000002100b6f4679893070000c9200000160000007468656d652f7468656d652f
|
||||
7468656d65312e786d6cec59cd8b1bc915bf07f23f347d97f5d5ad8fc1f2a24fcfda33b6b164873dd648a5eef2547789aad28cc56208de532e81c026e49085bd
|
||||
ed21842cecc22eb9e48f31d8249b3f22afaa5bdd5552c99e191c3061463074977eefd5afde7bf5de53d5ddcf5e26d4bbc05c1096f6fcfa9d9aefe174ce16248d
|
||||
7afeb3d9a4d2f13d2151ba4094a5b8e76fb0f03fbbf7eb5fdd454732c609f6403e1547a8e7c752ae8eaa5531876124eeb0154ee1bb25e30992f0caa3ea82a34b
|
||||
d09bd06aa3566b55134452df4b51026a1f2f97648ebd9952e9dfdb2a1f53784da5500373caa74a35b6243476715e5708b11143cabd0b447b3eccb3609733fc52
|
||||
fa1e4542c2173dbfa6fffceabdbb5574940b517940d6909be8bf5c2e17589c37f49c3c3a2b260d823068f50bfd1a40e53e6edc1eb7c6ad429f06a0f91c569a71
|
||||
b175b61bc320c71aa0ecd1a17bd41e35eb16ded0dfdce3dc0fd5c7c26b50a63fd8c34f2643b0a285d7a00c1feee1c3417730b2f56b50866fede1dbb5fe28685b
|
||||
fa3528a6243ddf43d7c25673b85d6d0159327aec8477c360d26ee4ca4b144443115d6a8a254be5a1584bd00bc6270050408a24493db959e1259a43140f112567
|
||||
9c7827248a21f056286502866b8ddaa4d684ffea13e827ed5174849121ad780113b137a4f87862cec94af6fc07a0d537206f7ffef9cdeb1fdfbcfee9cd575fbd
|
||||
79fdf77c6eadca923b466964cafdf2dd1ffef3cd6fbd7ffff0ed2f5fff319b7a172f4cfcbbbffdeedd3ffef93ef5b0e2d2146ffff4fdbb1fbf7ffbe7dfffebaf
|
||||
5f3bb4f7393a33e1339260e13dc297de5396c0021dfcf119bf9ec42c46c494e8a791402952b338f48f656ca11f6d10450edc00db767cce21d5b880f7d72f2cc2
|
||||
d398af2571687c182716f094313a60dc6985876a2ec3ccb3751ab927e76b13f714a10bd7dc43945a5e1eaf579063894be530c616cd2714a5124538c5d253dfb1
|
||||
738c1dabfb8210cbaea764ce99604be97d41bc01224e93ccc899154da5d03149c02f1b1741f0b7659bd3e7de8051d7aa47f8c246c2de40d4417e86a965c6fb68
|
||||
2d51e252394309350d7e8264ec2239ddf0b9891b0b099e8e3065de78818570c93ce6b05ec3e90f21cdb8dd7e4a37898de4929cbb749e20c64ce4889d0f6394ac
|
||||
5cd829496313fbb938871045de13265df05366ef10f50e7e40e941773f27d872f787b3c133c8b026a53240d4376beef0e57dccacf89d6ee8126157aae9f3c44a
|
||||
b17d4e9cd131584756689f604cd1255a60ec3dfbdcc160c05696cd4bd20f62c82ac7d815580f901dabea3dc5027a25d5dcece7c91322ac909de2881de073bad9
|
||||
493c1b9426881fd2fc08bc6eda7c0ca52e7105c0633a3f37818f08f480102f4ea33c16a0c308ee835a9fc4c82a60ea5db8e375c32dff5d658fc1be7c61d1b8c2
|
||||
be04197c6d1948eca6cc7b6d3343d49aa00c9819822ec3956e41c4727f29a28aab165b3be596f6a62ddd00dd91d5f42424fd6007b4d3fb84ffbbde073a8cb77f
|
||||
f9c6b10f3e4ebfe3566c25ab6b763a8792c9f14e7f7308b7dbd50c195f904fbfa919a175fa04431dd9cf58b73dcd6d4fe3ffdff73487f6f36d2773a8dfb8ed64
|
||||
7ce8306e3b99fc70e5e3743265f3027d8d3af0c80e7af4b14f72f0d46749289dca0dc527421ffc08f83db398c0a092d3279eb838055cc5f0a8ca1c4c60e1228e
|
||||
b48cc799fc0d91f134462b381daafb4a492472d591f0564cc0a1911e76ea5678ba4e4ed9223becacd7d5c16656590592e5782d2cc6e1a04a66e856bb3cc02bd4
|
||||
6bb6913e68dd1250b2d721614c6693683a48b4b783ca48fa58178ce620a157f65158741d2c3a4afdd6557b2c805ae115f8c1edc1cff49e1f06200242701e07cd
|
||||
f942f92973f5d6bbda991fd3d3878c69450034d8db08283ddd555c0f2e4fad2e0bb52b78da2261849b4d425b46377822869fc17974aad1abd0b8aeafbba54b2d
|
||||
7aca147a3e08ad9246bbf33e1637f535c8ede6069a9a9982a6de65cf6f35430899395af5fc251c1ac363b282d811ea3717a211dcbccc25cf36fc4d32cb8a0b39
|
||||
4222ce0cae934e960d122231f728497abe5a7ee1069aea1ca2b9d51b90103e59725d482b9f1a3970baed64bc5ce2b934dd6e8c284b67af90e1b35ce1fc568bdf
|
||||
1cac24d91adc3d8d1797de195df3a708422c6cd795011744c0dd413db3e682c0655891c8caf8db294c79da356fa3740c65e388ae62945714339967709dca0b3a
|
||||
faadb081f196af190c6a98242f8467912ab0a651ad6a5a548d8cc3c1aafb6121653923699635d3ca2aaa6abab39835c3b60cecd8f26645de60b53531e434b3c2
|
||||
67a97b37e576b7b96ea74f28aa0418bcb09fa3ea5ea12018d4cac92c6a8af17e1a56393b1fb56bc776811fa07695226164fdd656ed8edd8a1ae19c0e066f54f9
|
||||
416e376a6168b9ed2bb5a5f5adb979b1cdce5e40f2184197bba6526857c2c92e47d0104d754f92a50dd8222f65be35e0c95b73d2f3bfac85fd60d80887955a27
|
||||
1c57826650ab74c27eb3d20fc3667d1cd66ba341e31514161927f530bbb19fc00506dde4f7f67a7cefee3ed9ded1dc99b3a4caf4dd7c5513d777f7f5c6e1bb7b
|
||||
8f40d2f9b2d598749bdd41abd26df627956034e854bac3d6a0326a0ddba3c9681876ba9357be77a1c141bf390c5ae34ea5551f0e2b41aba6e877ba9576d068f4
|
||||
8376bf330efaaff23606569ea58fdc16605ecdebde7f010000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d65
|
||||
2f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d36
|
||||
3f2451eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e
|
||||
3198720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d985
|
||||
0528a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100e9de0fbfff0000001c020000130000000000000000000000
|
||||
0000000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b00000000000000000000
|
||||
000000300100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c0000000000000000000000000019020000
|
||||
7468656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d0014000600080000002100b6f4679893070000c92000001600000000000000
|
||||
000000000000d60200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b01000027000000
|
||||
000000000000000000009d0a00007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000980b00000000}
|
||||
{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d
|
||||
617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169
|
||||
6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363
|
||||
656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e}
|
||||
{\*\latentstyles\lsdstimax377\lsdlockeddef0\lsdsemihiddendef0\lsdunhideuseddef0\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 1;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 5;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 7;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 8;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index 9;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 1;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 2;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 3;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 4;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 5;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 6;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 7;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 8;\lsdsemihidden1 \lsdunhideused1 \lsdpriority39 \lsdlocked0 toc 9;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal Indent;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 header;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footer;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 index heading;\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of figures;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 envelope return;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 footnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation reference;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 line number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 page number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote reference;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 endnote text;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 table of authorities;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 macro;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 toa heading;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 3;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 3;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Bullet 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 3;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 4;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Number 5;\lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Closing;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Signature;\lsdsemihidden1 \lsdunhideused1 \lsdpriority1 \lsdlocked0 Default Paragraph Font;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 4;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 List Continue 5;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Message Header;\lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Salutation;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Date;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text First Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Note Heading;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Body Text Indent 3;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Block Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 FollowedHyperlink;\lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;
|
||||
\lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Document Map;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Plain Text;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 E-mail Signature;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Top of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Bottom of Form;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Normal (Web);\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Acronym;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Address;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Cite;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Code;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Definition;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Keyboard;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Preformatted;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Sample;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Typewriter;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 HTML Variable;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 annotation subject;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 No List;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 1;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 2;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Outline List 3;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Balloon Text;\lsdpriority39 \lsdlocked0 Table Grid;
|
||||
\lsdsemihidden1 \lsdlocked0 Placeholder Text;\lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing;\lsdpriority60 \lsdlocked0 Light Shading;\lsdpriority61 \lsdlocked0 Light List;\lsdpriority62 \lsdlocked0 Light Grid;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdpriority65 \lsdlocked0 Medium List 1;\lsdpriority66 \lsdlocked0 Medium List 2;\lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdpriority68 \lsdlocked0 Medium Grid 2;
|
||||
\lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdpriority70 \lsdlocked0 Dark List;\lsdpriority71 \lsdlocked0 Colorful Shading;\lsdpriority72 \lsdlocked0 Colorful List;\lsdpriority73 \lsdlocked0 Colorful Grid;\lsdpriority60 \lsdlocked0 Light Shading Accent 1;
|
||||
\lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;
|
||||
\lsdsemihidden1 \lsdlocked0 Revision;\lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 1;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdpriority60 \lsdlocked0 Light Shading Accent 2;\lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdpriority62 \lsdlocked0 Light Grid Accent 2;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 2;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2;\lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 2;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdpriority61 \lsdlocked0 Light List Accent 3;\lsdpriority62 \lsdlocked0 Light Grid Accent 3;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdpriority70 \lsdlocked0 Dark List Accent 3;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 3;\lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdpriority62 \lsdlocked0 Light Grid Accent 4;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 4;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 4;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdpriority60 \lsdlocked0 Light Shading Accent 5;\lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdpriority62 \lsdlocked0 Light Grid Accent 5;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 5;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5;\lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 5;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdpriority61 \lsdlocked0 Light List Accent 6;\lsdpriority62 \lsdlocked0 Light Grid Accent 6;
|
||||
\lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6;\lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;
|
||||
\lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6;\lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdpriority70 \lsdlocked0 Dark List Accent 6;\lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;
|
||||
\lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdpriority73 \lsdlocked0 Colorful Grid Accent 6;\lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis;
|
||||
\lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference;\lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdsemihidden1 \lsdunhideused1 \lsdpriority37 \lsdlocked0 Bibliography;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;\lsdpriority41 \lsdlocked0 Plain Table 1;\lsdpriority42 \lsdlocked0 Plain Table 2;\lsdpriority43 \lsdlocked0 Plain Table 3;\lsdpriority44 \lsdlocked0 Plain Table 4;
|
||||
\lsdpriority45 \lsdlocked0 Plain Table 5;\lsdpriority40 \lsdlocked0 Grid Table Light;\lsdpriority46 \lsdlocked0 Grid Table 1 Light;\lsdpriority47 \lsdlocked0 Grid Table 2;\lsdpriority48 \lsdlocked0 Grid Table 3;\lsdpriority49 \lsdlocked0 Grid Table 4;
|
||||
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 1;
|
||||
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 1;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 1;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 1;
|
||||
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 1;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 2;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 2;
|
||||
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 2;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 2;
|
||||
\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 3;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 3;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 3;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 3;
|
||||
\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 3;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 4;
|
||||
\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 4;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 4;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 4;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 4;
|
||||
\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 4;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 5;
|
||||
\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 5;\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 5;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 5;
|
||||
\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 5;\lsdpriority46 \lsdlocked0 Grid Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 Grid Table 2 Accent 6;\lsdpriority48 \lsdlocked0 Grid Table 3 Accent 6;
|
||||
\lsdpriority49 \lsdlocked0 Grid Table 4 Accent 6;\lsdpriority50 \lsdlocked0 Grid Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 Grid Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 Grid Table 7 Colorful Accent 6;
|
||||
\lsdpriority46 \lsdlocked0 List Table 1 Light;\lsdpriority47 \lsdlocked0 List Table 2;\lsdpriority48 \lsdlocked0 List Table 3;\lsdpriority49 \lsdlocked0 List Table 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark;
|
||||
\lsdpriority51 \lsdlocked0 List Table 6 Colorful;\lsdpriority52 \lsdlocked0 List Table 7 Colorful;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 1;\lsdpriority47 \lsdlocked0 List Table 2 Accent 1;\lsdpriority48 \lsdlocked0 List Table 3 Accent 1;
|
||||
\lsdpriority49 \lsdlocked0 List Table 4 Accent 1;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 1;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 1;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 1;
|
||||
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 2;\lsdpriority47 \lsdlocked0 List Table 2 Accent 2;\lsdpriority48 \lsdlocked0 List Table 3 Accent 2;\lsdpriority49 \lsdlocked0 List Table 4 Accent 2;
|
||||
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 2;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 2;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 2;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 3;
|
||||
\lsdpriority47 \lsdlocked0 List Table 2 Accent 3;\lsdpriority48 \lsdlocked0 List Table 3 Accent 3;\lsdpriority49 \lsdlocked0 List Table 4 Accent 3;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 3;
|
||||
\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 3;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 3;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 4;\lsdpriority47 \lsdlocked0 List Table 2 Accent 4;
|
||||
\lsdpriority48 \lsdlocked0 List Table 3 Accent 4;\lsdpriority49 \lsdlocked0 List Table 4 Accent 4;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 4;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 4;
|
||||
\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 4;\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 5;\lsdpriority47 \lsdlocked0 List Table 2 Accent 5;\lsdpriority48 \lsdlocked0 List Table 3 Accent 5;
|
||||
\lsdpriority49 \lsdlocked0 List Table 4 Accent 5;\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 5;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 5;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 5;
|
||||
\lsdpriority46 \lsdlocked0 List Table 1 Light Accent 6;\lsdpriority47 \lsdlocked0 List Table 2 Accent 6;\lsdpriority48 \lsdlocked0 List Table 3 Accent 6;\lsdpriority49 \lsdlocked0 List Table 4 Accent 6;
|
||||
\lsdpriority50 \lsdlocked0 List Table 5 Dark Accent 6;\lsdpriority51 \lsdlocked0 List Table 6 Colorful Accent 6;\lsdpriority52 \lsdlocked0 List Table 7 Colorful Accent 6;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Mention;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Smart Hyperlink;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Hashtag;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Unresolved Mention;\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Smart Link;
|
||||
\lsdsemihidden1 \lsdunhideused1 \lsdlocked0 Smart Link Error;}}{\*\datastore 0105000002000000180000004d73786d6c322e534158584d4c5265616465722e362e3000000000000000000000060000
|
||||
d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
|
||||
ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffff0c6ad98892f1d411a65f0040963251e500000000000000000000000080ae
|
||||
5e176d5cd601feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000
|
||||
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000
|
||||
000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000
|
||||
0000000000000000000000000000000000000000000000000105000000000000}}
|
||||
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<RevitAddIns>
|
||||
<AddIn Type="Command">
|
||||
<Assembly>RebarFreeForm.dll</Assembly>
|
||||
<ClientId>CD45950E-C27F-4728-AF35-E19B64E65FBD</ClientId>
|
||||
<FullClassName>Revit.SDK.Samples.RebarFreeForm.CS.AddSharedParams</FullClassName>
|
||||
<Text>Add Parameters</Text>
|
||||
<Description>External command to add shared parameters to Rebar</Description>
|
||||
<VisibilityMode>AlwaysVisible</VisibilityMode>
|
||||
<LanguageType>Unknown</LanguageType>
|
||||
<VendorId>ADSK</VendorId>
|
||||
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
|
||||
</AddIn>
|
||||
<AddIn Type="Command">
|
||||
<Assembly>RebarFreeForm.dll</Assembly>
|
||||
<ClientId>9d871749-6401-419f-ba8f-99a44c03adf5</ClientId>
|
||||
<FullClassName>Revit.SDK.Samples.RebarFreeForm.CS.Command</FullClassName>
|
||||
<Text>Create Rebar Free Form</Text>
|
||||
<Description>External command to create a Rebar FreeForm element and external application to implement the custom server used to regenerate the rebar geometry based on constraints</Description>
|
||||
<VisibilityMode>AlwaysVisible</VisibilityMode>
|
||||
<LanguageType>Unknown</LanguageType>
|
||||
<VendorId>ADSK</VendorId>
|
||||
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
|
||||
</AddIn>
|
||||
<AddIn Type="Application">
|
||||
<Name>RebarFreeForm</Name>
|
||||
<Assembly>RebarFreeForm.dll</Assembly>
|
||||
<ClientId>a6ea850e-a041-48bb-85f5-8ce21b2ba972</ClientId>
|
||||
<FullClassName>Revit.SDK.Samples.RebarFreeForm.CS.Application</FullClassName>
|
||||
<VendorId>ADSK</VendorId>
|
||||
<VendorDescription>Autodesk, www.autodesk.com</VendorDescription>
|
||||
</AddIn>
|
||||
</RevitAddIns>
|
||||
@@ -0,0 +1,71 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProductVersion>9.0.30729</ProductVersion>
|
||||
<SchemaVersion>2.0</SchemaVersion>
|
||||
<ProjectGuid>{08C2DFB2-27F1-4A40-BE07-488441934FE7}</ProjectGuid>
|
||||
<OutputType>Library</OutputType>
|
||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||
<RootNamespace>Revit.SDK.Samples.RebarFreeForm.CS</RootNamespace>
|
||||
<AssemblyName>RebarFreeForm</AssemblyName>
|
||||
<StartupObject>
|
||||
</StartupObject>
|
||||
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||
<TargetFrameworkProfile />
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>full</DebugType>
|
||||
<Optimize>false</Optimize>
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<DocumentationFile>bin\Debug\RebarFreeForm.XML</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||
<DebugType>pdbonly</DebugType>
|
||||
<Optimize>true</Optimize>
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<ErrorReport>prompt</ErrorReport>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Deployment" />
|
||||
<Reference Include="System.Drawing" />
|
||||
<Reference Include="System.Windows.Forms" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="System.Core">
|
||||
<RequiredTargetFramework>4.5.2</RequiredTargetFramework>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="AddSharedParams.cs" />
|
||||
<Compile Include="Application.cs" />
|
||||
<Compile Include="Command.cs" />
|
||||
<Compile Include="CurveElementRegenUpdater.cs" />
|
||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||
<Compile Include="RebarUpdateServer.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(SolutionDir)VSProps\SDKSamples.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
Other similar extension points exist, see Microsoft.Common.targets.
|
||||
<Target Name="BeforeBuild">
|
||||
</Target>
|
||||
<Target Name="AfterBuild">
|
||||
</Target>
|
||||
-->
|
||||
<PropertyGroup>
|
||||
<PostBuildEvent>set FILEFORSAMPLEREG="$(SolutionDir)..\..\..\..\Regression\API\SDKSamples\UpdateSampleDllForRegression.pl"
|
||||
if exist %25FILEFORSAMPLEREG%25 perl %25FILEFORSAMPLEREG%25 $(ProjectExt) "$(ProjectPath)" "$(TargetPath)" "$(SolutionDir)"</PostBuildEvent>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -0,0 +1,771 @@
|
||||
//
|
||||
// (C) Copyright 2003-2016 by Autodesk, Inc.
|
||||
//
|
||||
// Permission to use, copy, modify, and distribute this software in
|
||||
// object code form for any purpose and without fee is hereby granted,
|
||||
// provided that the above copyright notice appears in all copies and
|
||||
// that both that copyright notice and the limited warranty and
|
||||
// restricted rights notice below appear in all supporting
|
||||
// documentation.
|
||||
//
|
||||
// AUTODESK PROVIDES THIS PROGRAM "AS IS" AND WITH ALL FAULTS.
|
||||
// AUTODESK SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTY OF
|
||||
// MERCHANTABILITY OR FITNESS FOR A PARTICULAR USE. AUTODESK, INC.
|
||||
// DOES NOT WARRANT THAT THE OPERATION OF THE PROGRAM WILL BE
|
||||
// UNINTERRUPTED OR ERROR FREE.
|
||||
//
|
||||
// Use, duplication, or disclosure by the U.S. Government is subject to
|
||||
// restrictions set forth in FAR 52.227-19 (Commercial Computer
|
||||
// Software - Restricted Rights) and DFAR 252.227-7013(c)(1)(ii)
|
||||
// (Rights in Technical Data and Computer Software), as applicable.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Autodesk.Revit.DB.ExternalService;
|
||||
using Autodesk.Revit.ApplicationServices;
|
||||
using Autodesk.Revit.DB;
|
||||
using Autodesk.Revit.DB.Structure;
|
||||
|
||||
namespace Revit.SDK.Samples.RebarFreeForm.CS
|
||||
{
|
||||
/// <summary>
|
||||
/// Class used to represent a structural face that is part of a rebar constraint.
|
||||
/// </summary>
|
||||
class TargetFace
|
||||
{
|
||||
public TargetFace()
|
||||
{
|
||||
Transform = Transform.Identity;
|
||||
Offset = 0.0;
|
||||
Face = null;
|
||||
}
|
||||
//Actual face to constrain to
|
||||
public Face Face { get; set; }
|
||||
//The transform of the geometry element where the face belongs
|
||||
public Transform Transform { get; set; }
|
||||
//offset value used for calculating bars
|
||||
public double Offset { get; set; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Enum defining the custom handles used by this server to identify the different custom constraints
|
||||
/// </summary>
|
||||
enum BarHandle { FirstHandle, SecondHandle, ThirdHandle, StartHandle, EndHandle };
|
||||
|
||||
/// <summary>
|
||||
/// Implements the Revit add-in interface IRebarUpdateServer;
|
||||
/// This class is an external server that is capable of calculating
|
||||
/// straight sets of bars of variable length, following the constrained structural planar faces;
|
||||
/// The Rebar FreeForm element created using this server will have 3 custom Rebar Handles,
|
||||
/// that can each constrain one planar face, and Start/End handles that will search for targets
|
||||
/// to constrain automatically, then adjust the curves accordingly.
|
||||
/// Bar geometry results from intersecting faces and interpolation from the intersection results:
|
||||
/// - First bar is the intersection of First Handle target with Second Handle target;
|
||||
/// - Last bar is the intersection of First Handle target with Third Handle target;
|
||||
/// - All other bars are created between the first and last bar so that they have equal distance between them.
|
||||
/// </summary>
|
||||
class RebarUpdateServer : Autodesk.Revit.DB.Structure.IRebarUpdateServer
|
||||
{
|
||||
#region Class Members
|
||||
/// <summary>
|
||||
/// SampleGuid represents the Guid used by the Revit ExternalService framework to identify this custom IRebarUpdateServer
|
||||
/// For a Rebar to use this custom external server, pass this Guid to the Rebar.CreateFreeForm(..) function.
|
||||
/// </summary>
|
||||
public static System.Guid SampleGuid = new Guid("64D176BA-EB3E-4E96-877D-46A3B0C17B93");
|
||||
#endregion
|
||||
|
||||
#region Class Interface Implementation
|
||||
|
||||
/// <summary>
|
||||
/// Returns the unique id of this server
|
||||
/// </summary>
|
||||
public System.Guid GetServerId()
|
||||
{
|
||||
return SampleGuid;
|
||||
}
|
||||
/// <summary>
|
||||
/// returns the id of the service that handles this server
|
||||
/// </summary>
|
||||
public ExternalServiceId GetServiceId()
|
||||
{
|
||||
return ExternalServices.BuiltInExternalServices.RebarUpdateService;
|
||||
}
|
||||
/// <summary>
|
||||
/// Returns name of the server
|
||||
/// </summary>
|
||||
public System.String GetName()
|
||||
{
|
||||
return "RebarUpdateServerSample";
|
||||
}
|
||||
/// <summary>
|
||||
/// Returns information about the vendor.
|
||||
/// </summary>
|
||||
public System.String GetVendorId()
|
||||
{
|
||||
return "ADSK";
|
||||
}
|
||||
/// <summary>
|
||||
/// Returns description of this server.
|
||||
/// </summary>
|
||||
public System.String GetDescription()
|
||||
{
|
||||
return "Sample to demonstrate implementing an external server to handle rebar constraints calculation";
|
||||
}
|
||||
/// <summary>
|
||||
/// Function used to define the Rebar Handles used by this server to calculate the constraints when regenerating the Rebar element.
|
||||
/// Rebar handles represent abstract "parts" of the Rebar that can be custom constrained to one or more targets.
|
||||
/// A custom Rebar Handle is defined with a unique key (int),
|
||||
/// that the external server uses to identify each RebarConstraint that is attached to the Rebar and compute accordingly.
|
||||
/// </summary>
|
||||
/// <param name="data">Class used to pass information from the external application to the internal Rebar Element.
|
||||
/// data receives the custom, start and end Rebar handle definitions used by this server
|
||||
/// </param>
|
||||
/// <returns> true if handle definition was completed successfully, false otherwise</returns>
|
||||
public bool GetCustomHandles(RebarHandlesData data)
|
||||
{
|
||||
data.AddCustomHandle((int)BarHandle.FirstHandle);
|
||||
data.AddCustomHandle((int)BarHandle.SecondHandle);
|
||||
data.AddCustomHandle((int)BarHandle.ThirdHandle);
|
||||
data.SetStartHandle((int)BarHandle.StartHandle);
|
||||
data.SetEndHandle((int)BarHandle.EndHandle);
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function used to compute the custom RebarHandle position in respect to the Rebar geometry,
|
||||
/// for display of graphical controls during GraphicalConstraintsManager edit mode
|
||||
/// </summary>
|
||||
/// <param name="data">Class used to pass information between the external application and the internal Rebar Element.
|
||||
/// data exposes geometry to the external application and receives the calculated absolute positions of the handles in the model space
|
||||
/// </param>
|
||||
/// <returns> true if execution was completed successfully, false otherwise</returns>
|
||||
public bool GetHandlesPosition(RebarHandlePositionData data)
|
||||
{
|
||||
if (data.GetNumberOfBars() <= 0)
|
||||
return false;
|
||||
|
||||
IList<Curve> firstBar = data.GetBarGeometry(0);
|
||||
data.SetPosition((int)BarHandle.FirstHandle, firstBar[0].Evaluate(0.5, true));
|
||||
data.SetPosition((int)BarHandle.SecondHandle, firstBar[0].Evaluate(0.3, true));
|
||||
data.SetPosition((int)BarHandle.ThirdHandle, firstBar[0].Evaluate(0.7, true));
|
||||
data.SetPosition((int)BarHandle.StartHandle, firstBar[0].Evaluate(0, true));
|
||||
data.SetPosition((int)BarHandle.EndHandle, firstBar[0].Evaluate(1, true));
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function resolves the User-facing name for the custom-defined Rebar handles
|
||||
/// </summary>
|
||||
/// <param name="handleNameData">Class used to pass information from the external application to the internal Rebar Element.
|
||||
/// data receives the name for the Rebar Handle it specifies
|
||||
/// </param>
|
||||
/// <returns> true if operation was completed successfully, false otherwise</returns>
|
||||
public bool GetCustomHandleName(RebarHandleNameData handleNameData)
|
||||
{
|
||||
switch (handleNameData.GetCustomHandleTag())
|
||||
{
|
||||
case (int)BarHandle.FirstHandle:
|
||||
handleNameData.SetCustomHandleName("First Handle");
|
||||
break;
|
||||
case (int)BarHandle.SecondHandle:
|
||||
handleNameData.SetCustomHandleName("Second Handle");
|
||||
break;
|
||||
case (int)BarHandle.ThirdHandle:
|
||||
handleNameData.SetCustomHandleName("Third Handle");
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function used to compute the geometry information of the Rebar element during document regeneration.
|
||||
/// Geometry information includes:
|
||||
/// 1. Graphical representation of the Rebar or Rebar Set;
|
||||
/// 2. Hook placement;
|
||||
/// 3. Distribution Path for MRA;
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="data">Class used to pass information from the external application to the internal Rebar Element.
|
||||
/// Interfaces with the Rebar Element and exposes information needed for geometric calculation during regeneration,
|
||||
/// such as constrained geometry, state of changed input information, etc.
|
||||
/// Receives the result of the custom constraint calculation and
|
||||
/// updates the element after the entire function finished successfully.
|
||||
/// </param>
|
||||
/// <returns> true if geometry generation was completed successfully, false otherwise</returns>
|
||||
public bool GenerateCurves(RebarCurvesData data)
|
||||
{
|
||||
// used to store the faces and transforms used in generation of curves
|
||||
TargetFace firstFace = new TargetFace();
|
||||
TargetFace secondFace = new TargetFace();
|
||||
TargetFace thirdFace = new TargetFace();
|
||||
//iterate through the available constraints and extract the needed information
|
||||
IList<RebarConstraint> constraints = data.GetRebarUpdateCurvesData().GetCustomConstraints();
|
||||
foreach (RebarConstraint constraint in constraints)
|
||||
{
|
||||
if (constraint.NumberOfTargets > 1)
|
||||
return false;
|
||||
Transform tempTrf = Transform.Identity;
|
||||
double dfOffset = 0;
|
||||
if (!getOffsetFromConstraintAtTarget(data.GetRebarUpdateCurvesData(), constraint, 0, out dfOffset))
|
||||
return false;
|
||||
|
||||
switch ((BarHandle)constraint.GetCustomHandleTag())
|
||||
{
|
||||
case BarHandle.FirstHandle:
|
||||
{
|
||||
Face face = constraint.GetTargetHostFaceAndTransform(0, tempTrf);
|
||||
firstFace = new TargetFace() { Face = face, Transform = tempTrf, Offset = dfOffset };
|
||||
break;
|
||||
}
|
||||
case BarHandle.SecondHandle:
|
||||
{
|
||||
Face face = constraint.GetTargetHostFaceAndTransform(0, tempTrf);
|
||||
secondFace = new TargetFace() { Face = face, Transform = tempTrf, Offset = dfOffset };
|
||||
break;
|
||||
}
|
||||
case BarHandle.ThirdHandle:
|
||||
{
|
||||
Face face = constraint.GetTargetHostFaceAndTransform(0, tempTrf);
|
||||
thirdFace = new TargetFace() { Face = face, Transform = tempTrf, Offset = dfOffset };
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
// check if all the input is present for the calculation, otherwise return error(false).
|
||||
if (firstFace.Face == null || secondFace.Face == null || thirdFace.Face == null)
|
||||
return false;
|
||||
|
||||
Rebar thisBar = getCurrentRebar(data.GetRebarUpdateCurvesData());
|
||||
CurveElement selectedCurve = null;
|
||||
//if a curve elem is selected, we override the geometry we get from the intersections and use the selected curve to create our bar geometries
|
||||
selectedCurve = getSelectedCurveElement(thisBar, data.GetRebarUpdateCurvesData());
|
||||
//used to store the resulting curves
|
||||
List<Curve> curves = new List<Curve>();
|
||||
Curve originalBar = null;
|
||||
Curve singleBar = getOffsetCurveAtIntersection(firstFace, secondFace);
|
||||
if (selectedCurve != null)
|
||||
{
|
||||
Transform trf = Transform.CreateTranslation(singleBar.GetEndPoint(0) - selectedCurve.GeometryCurve.GetEndPoint(0));
|
||||
originalBar = singleBar;
|
||||
singleBar = selectedCurve.GeometryCurve.CreateTransformed(trf);
|
||||
}
|
||||
//we can't make any more bars without the first one.
|
||||
if (singleBar == null)
|
||||
return false;
|
||||
|
||||
// check the layout rule to see if we need to create more bars
|
||||
// for this example, any rule that is not single will generate bars in the same way,
|
||||
// creating them at an equal distance to each other, based only on number of bars
|
||||
RebarLayoutRule layout = data.GetRebarUpdateCurvesData().GetLayoutRule();
|
||||
switch (layout)
|
||||
{
|
||||
case RebarLayoutRule.Single:// first bar creation: intersect first face with second face to get a curve
|
||||
curves.Add(singleBar);
|
||||
break;
|
||||
case RebarLayoutRule.FixedNumber:
|
||||
case RebarLayoutRule.NumberWithSpacing:
|
||||
case RebarLayoutRule.MaximumSpacing:
|
||||
case RebarLayoutRule.MinimumClearSpacing:
|
||||
curves.Add(singleBar);
|
||||
Curve lastBar = getOffsetCurveAtIntersection(firstFace, thirdFace);// create last bar
|
||||
|
||||
// keep the curves pointing in the same direction
|
||||
var firstBar = (selectedCurve != null) ? originalBar : singleBar;
|
||||
if (lastBar == null || !alignBars(ref firstBar, ref lastBar))
|
||||
return false;
|
||||
if (selectedCurve != null)
|
||||
{
|
||||
Transform trf = Transform.CreateTranslation(lastBar.GetEndPoint(0) - selectedCurve.GeometryCurve.GetEndPoint(0));
|
||||
lastBar = selectedCurve.GeometryCurve.CreateTransformed(trf);
|
||||
}
|
||||
|
||||
if (!generateSet(singleBar, lastBar, layout,
|
||||
data.GetRebarUpdateCurvesData().GetBarsNumber(),
|
||||
data.GetRebarUpdateCurvesData().Spacing, ref curves, selectedCurve == null ? null : selectedCurve.GeometryCurve))
|
||||
return false;
|
||||
curves.Add(lastBar);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// check if any curves were created
|
||||
if (curves.Count <= 0)
|
||||
return false;
|
||||
|
||||
// create the distribution path for the bars that were created;
|
||||
// one single bar will not have a distribution path.
|
||||
List<Curve> distribPath = new List<Curve>();
|
||||
for (int ii = 0; ii < curves.Count - 1; ii++)
|
||||
distribPath.Add(Line.CreateBound(curves[ii].Evaluate(0.5, true), curves[ii + 1].Evaluate(0.5, true)));
|
||||
// set distribution path if we have a path created
|
||||
if (distribPath.Count > 0)
|
||||
data.SetDistributionPath(distribPath);
|
||||
|
||||
// add each curve as separate bar in the set.
|
||||
for (int ii = 0; ii < curves.Count; ii++)
|
||||
{
|
||||
List<Curve> barCurve = new List<Curve>();
|
||||
barCurve.Add(curves[ii]);
|
||||
data.AddBarGeometry(barCurve);
|
||||
|
||||
// set the hook normals for each bar added
|
||||
// important!: hook normals set here will be reset if bar geometry is changed on TrimExtendCurves
|
||||
// so they need to be recalculated then.
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
XYZ normal = computeNormal(curves[ii], firstFace, i);
|
||||
if (normal != null && !normal.IsZeroLength())
|
||||
data.GetRebarUpdateCurvesData().SetHookPlaneNormalForBarIdx(i, ii, normal);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function used to adjust the computed geometry information of the rebar element and has two logical parts:
|
||||
/// - Selection of structural faces for creation of Start of Bar and End of Bar Constraints when needed
|
||||
/// (Constraints created here are visible and modifiable in the Graphical Constraints Manager in native Revit)
|
||||
/// The constraint search is done by listing all the faces from the structural pointed to by the FirstHandle constraint
|
||||
/// and then picking the face that has the closest intersection point with either the curves in the rebar, or their extensions
|
||||
/// - Adjustments are done to the start/end of the bars according to the corresponding constraints
|
||||
/// Each bar will be lengthened to the intersection point of the tangent in the curve's specified end with the corresponding constraint face,
|
||||
/// or it will be shortened to the intersection point of the curve itself with the corresponding constraint face.
|
||||
/// - Hook normals for each bar are calculated for the newly modified curves.
|
||||
/// This function is called after the successful execution of GenerateCurves
|
||||
/// </summary>
|
||||
/// <param name="data">Class used to pass information from the external application to the internal Rebar Element.
|
||||
/// Interfaces with the Rebar Element and exposes information needed for Constraint creation, face searching, and
|
||||
/// receives the result of the Start/End constraint calculation.
|
||||
/// updates are done on the element after the entire function finished successfully.
|
||||
/// </param>
|
||||
/// <returns> true if execution was completed successfully, false otherwise</returns>
|
||||
public bool TrimExtendCurves(RebarTrimExtendData data)
|
||||
{
|
||||
if (getSelectedCurveElement(getCurrentRebar(data.GetRebarUpdateCurvesData()), data.GetRebarUpdateCurvesData()) != null)
|
||||
return true;
|
||||
|
||||
// extract the curves from the element.
|
||||
IList<Curve> allbars = new List<Curve>();
|
||||
for (int ii = 0; ii < data.GetRebarUpdateCurvesData().GetBarsNumber(); ii++)
|
||||
allbars.Add(data.GetRebarUpdateCurvesData().GetBarGeometry(ii)[0]);
|
||||
// Place for caching the faces of the host used in constraint search.
|
||||
List<TargetFace> hostFaces = new List<TargetFace>();
|
||||
|
||||
// repeat process for each end of the Rebar.
|
||||
for (int iBarEnd = 0; iBarEnd < 2; iBarEnd++)
|
||||
{
|
||||
List<TargetFace> faces = new List<TargetFace>();
|
||||
// get current Start/End constraint
|
||||
RebarConstraint constraint = (iBarEnd == 0) ? data.GetRebarUpdateCurvesData().GetStartConstraint() :
|
||||
data.GetRebarUpdateCurvesData().GetEndConstraint();
|
||||
|
||||
//if no constraint present, then search for a new one
|
||||
if (constraint == null)
|
||||
{
|
||||
if (hostFaces.Count <= 0)// fetch the faces of the structural used for searching constraints.
|
||||
{
|
||||
// used compute references to true to make sure we can create constraints with the faces we find
|
||||
Options geomOptions = new Options();
|
||||
geomOptions.ComputeReferences = true;
|
||||
// the host structural is considered the first structural in the first constraint
|
||||
GeometryElement elemGeometry = data.GetRebarUpdateCurvesData().GetCustomConstraints()[0].GetTargetElement(0).get_Geometry(geomOptions);
|
||||
if (elemGeometry == null)
|
||||
return false;
|
||||
hostFaces = getFacesFromElement(elemGeometry);
|
||||
}
|
||||
|
||||
// for each bar try to find the closest face that intersects with it, or its extension, at the specified end
|
||||
for (int idx = 0; idx < allbars.Count; idx++)
|
||||
faces.Add(searchForFace(allbars[idx], hostFaces, iBarEnd));
|
||||
|
||||
// gather valid references for constraint creation
|
||||
List<Reference> refs = new List<Reference>();
|
||||
foreach (TargetFace face in faces)
|
||||
if (face.Face.Reference != null && !refs.Contains(face.Face.Reference))
|
||||
refs.Add(face.Face.Reference);
|
||||
|
||||
// if we have any valid references, we create the constraint for the specified bar end.
|
||||
if (refs.Count > 0)
|
||||
{
|
||||
if (iBarEnd == 0)
|
||||
data.CreateStartConstraint(refs, false, 0.0);
|
||||
else
|
||||
data.CreateEndConstraint(refs, false, 0.0);
|
||||
}
|
||||
}
|
||||
else// if constraint is present, extract needed information to calculate trim/extend
|
||||
{
|
||||
for (int nTarget = 0; nTarget < constraint.NumberOfTargets; nTarget++)
|
||||
{
|
||||
var trf = Transform.Identity;
|
||||
Face constrainedFace = constraint.GetTargetHostFaceAndTransform(nTarget, trf);
|
||||
if (constrainedFace == null)
|
||||
continue;
|
||||
double dfOffset;
|
||||
if (getOffsetFromConstraintAtTarget(data.GetRebarUpdateCurvesData(), constraint, 0, out dfOffset))
|
||||
faces.Add(new TargetFace() { Face = constrainedFace, Transform = trf, Offset = dfOffset });
|
||||
}
|
||||
}
|
||||
|
||||
// for each bar, find out where it intersects with the selected faces and replace the original curve with a new one that is shorter or longer.
|
||||
// first search for extension intersection (use tangent curve in the end point of the curve), then search for actual curve intersection
|
||||
for (int idx = 0; idx < allbars.Count; idx++)
|
||||
{
|
||||
XYZ intersection;
|
||||
Curve barCurve = allbars[idx];
|
||||
if (!(barCurve is Line))// this code only deals with input curves that are straight lines
|
||||
return false;
|
||||
Line tangent = Line.CreateUnbound(barCurve.GetEndPoint(iBarEnd), barCurve.ComputeDerivatives(iBarEnd, true).BasisX.Normalize() * (iBarEnd == 0 ? -1 : 1));
|
||||
double dfOffset = 0.0;
|
||||
if (getIntersection(tangent, faces, out intersection, out dfOffset) || getIntersection(barCurve, faces, out intersection, out dfOffset))
|
||||
{
|
||||
Curve newCurve = null;
|
||||
try
|
||||
{
|
||||
XYZ barDir = (barCurve.GetEndPoint(1) - barCurve.GetEndPoint(0)).Normalize();
|
||||
if ((iBarEnd == 0))
|
||||
newCurve = Line.CreateBound(intersection - barDir * dfOffset, barCurve.GetEndPoint(1));
|
||||
else
|
||||
newCurve = Line.CreateBound(barCurve.GetEndPoint(0), intersection + barDir * dfOffset);
|
||||
}
|
||||
catch { }
|
||||
// if new curve available, replace the old one.
|
||||
if (newCurve != null)
|
||||
allbars[idx] = newCurve;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// get the FirstHandle constraint and extract the target face to use in determining the hook orientation for each bar
|
||||
TargetFace firstFace = new TargetFace();
|
||||
IList<RebarConstraint> constraints = data.GetRebarUpdateCurvesData().GetCustomConstraints();
|
||||
foreach (RebarConstraint constraint in constraints)
|
||||
if ((BarHandle)constraint.GetCustomHandleTag() == BarHandle.FirstHandle)
|
||||
{
|
||||
Transform tempTrf = Transform.Identity;
|
||||
double dfOffset;
|
||||
if (!getOffsetFromConstraintAtTarget(data.GetRebarUpdateCurvesData(), constraint, 0, out dfOffset))
|
||||
return false;
|
||||
firstFace = new TargetFace() { Face = constraint.GetTargetHostFaceAndTransform(0, tempTrf), Transform = tempTrf, Offset = dfOffset };
|
||||
break;
|
||||
}
|
||||
|
||||
// add each curve as separate bar in the set.
|
||||
for (int ii = 0; ii < allbars.Count; ii++)
|
||||
{
|
||||
List<Curve> barCurve = new List<Curve>();
|
||||
barCurve.Add(allbars[ii]);
|
||||
data.AddBarGeometry(barCurve);
|
||||
// hook normals are reset when adding new bar geometry, so we need to
|
||||
// set the hook normals for each bar that was modified
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
XYZ normal = computeNormal(allbars[ii], firstFace, i);
|
||||
if (normal != null && !normal.IsZeroLength())
|
||||
data.GetRebarUpdateCurvesData().SetHookPlaneNormalForBarIdx(i, ii, normal);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Class Implementations
|
||||
|
||||
/// <summary>
|
||||
/// function used to extract current rebar
|
||||
/// </summary>
|
||||
/// <param name="data"> data used to pass or get information regarding constraints cover</param>
|
||||
/// <returns>Current rebar element being regenerated</returns>
|
||||
Rebar getCurrentRebar(RebarUpdateCurvesData data)
|
||||
{
|
||||
ElementId rebarId = data.GetRebarId();
|
||||
return data.GetDocument().GetElement(rebarId) as Rebar;
|
||||
}
|
||||
|
||||
CurveElement getSelectedCurveElement(Rebar bar, RebarUpdateCurvesData data)
|
||||
{
|
||||
RebarFreeFormAccessor barAccess = bar.GetFreeFormAccessor();
|
||||
Parameter paramCurveId = bar.LookupParameter(AddSharedParams.m_CurveIdName);
|
||||
if (paramCurveId == null)
|
||||
return null;
|
||||
ElementId id = new ElementId(paramCurveId.AsInteger());
|
||||
return data.GetDocument().GetElement(id) as CurveElement;
|
||||
}
|
||||
/// <summary>
|
||||
/// function used to extract offset value from constraint
|
||||
/// </summary>
|
||||
/// <param name="updateData"> data used to pass or get information regarding constraints cover</param>
|
||||
/// <param name="constraint">constraint from which we extract the offset information</param>
|
||||
/// <param name="targetIdx">index of target in constraint</param>
|
||||
/// <param name="offset"> output value </param>
|
||||
/// <returns></returns>
|
||||
public static bool getOffsetFromConstraintAtTarget(RebarUpdateCurvesData updateData, RebarConstraint constraint, int targetIdx, out double offset)
|
||||
{
|
||||
offset = 0.0;
|
||||
if (updateData == null || constraint == null)
|
||||
return false;
|
||||
|
||||
double barDiam = updateData.GetBarModelDiameter();
|
||||
var rebarStyle = updateData.GetRebarStyle();
|
||||
var attachment = updateData.GetAttachmentType();
|
||||
bool bIsInside = rebarStyle == RebarStyle.Standard || (rebarStyle != RebarStyle.Standard && attachment == StirrupTieAttachmentType.InteriorFace);
|
||||
|
||||
if (constraint.IsToCover())
|
||||
{
|
||||
if (targetIdx < 0 || targetIdx >= constraint.NumberOfTargets)
|
||||
return false; // incorrect index
|
||||
RebarCoverType coverType = constraint.GetTargetCoverType(targetIdx);
|
||||
double coverDist = (coverType == null) ? 0.0 : coverType.CoverDistance;
|
||||
double diameterOffset = (barDiam / 2);
|
||||
if (bIsInside)
|
||||
diameterOffset *= -1;
|
||||
offset = constraint.GetDistanceToTargetCover() - coverDist + diameterOffset;
|
||||
return true;
|
||||
}
|
||||
|
||||
offset = constraint.GetDistanceToTargetHostFace();
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// function that finds the closest face to a specified end of a curve of the direction of the curve
|
||||
/// </summary>
|
||||
/// <param name="curve">
|
||||
/// curve used to find the closest face
|
||||
/// </param>
|
||||
/// /// <param name="faces">
|
||||
/// list of faces that are parsed to find the closest one
|
||||
/// </param>
|
||||
/// /// <param name="iEnd">
|
||||
/// input parameter specifying the curve end for wich the search is taking place
|
||||
/// </param>
|
||||
/// <returns> the FaceTrf that is closest to the curve end</returns>
|
||||
private TargetFace searchForFace(Curve curve, List<TargetFace> faces, int iEnd)
|
||||
{
|
||||
TargetFace bestFace = new TargetFace();
|
||||
double minDistance = Double.MaxValue;
|
||||
// create tangent to find intersections on the curve's extension
|
||||
Line tangent = Line.CreateUnbound(curve.GetEndPoint(iEnd), curve.ComputeDerivatives(iEnd, true).BasisX.Normalize() * (iEnd == 0 ? -1 : 1));
|
||||
// iterate through faces and keep the face closest to the specified end of the curve
|
||||
foreach (TargetFace hostFace in faces)
|
||||
{
|
||||
IntersectionResultArray results;
|
||||
// intersect tangent to find faces outside the curve
|
||||
if (hostFace.Face.Intersect(tangent.CreateTransformed(hostFace.Transform.Inverse), out results) == SetComparisonResult.Overlap)
|
||||
{
|
||||
foreach (IntersectionResult intersect in results)
|
||||
{
|
||||
double distance = hostFace.Transform.OfPoint(intersect.XYZPoint).DistanceTo(curve.GetEndPoint(iEnd));
|
||||
// if intersection is not on the curve( "behind" the tangent origin, considering the direction),
|
||||
// and the distance from the end of the curve to the face is the smallest, keep face.
|
||||
double param = tangent.Project(hostFace.Transform.OfPoint(intersect.XYZPoint)).Parameter;
|
||||
if (param >= 0 && distance < minDistance)
|
||||
{
|
||||
bestFace = hostFace;
|
||||
minDistance = distance;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (hostFace.Face.Intersect(curve.CreateTransformed(hostFace.Transform.Inverse), out results) == SetComparisonResult.Overlap)
|
||||
{
|
||||
foreach (IntersectionResult intersect in results)
|
||||
{
|
||||
double distance = hostFace.Transform.OfPoint(intersect.XYZPoint).DistanceTo(curve.GetEndPoint(iEnd));
|
||||
if (distance < minDistance)
|
||||
{
|
||||
bestFace = hostFace;
|
||||
minDistance = distance;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return bestFace;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// calculates the normal of the plane in which hooks for a certain curve should bend.
|
||||
/// </summary>
|
||||
/// <param name="curve">
|
||||
/// hook normal is calculated for this curve
|
||||
/// </param>
|
||||
/// /// <param name="face">
|
||||
/// face used as a reference for finding the hook normal, together with the curve
|
||||
/// </param>
|
||||
/// /// <param name="iEnd">
|
||||
/// specifies the end at which the hook normal to be calculated
|
||||
/// </param>
|
||||
/// <returns> the plane normal that was calculated</returns>
|
||||
private XYZ computeNormal(Curve curve, TargetFace face, int iEnd)
|
||||
{
|
||||
XYZ curveTangent = curve.ComputeDerivatives(iEnd, true).BasisX.Normalize();
|
||||
XYZ refPoint = curve.GetEndPoint(iEnd);
|
||||
IntersectionResult proj = face.Face.Project(face.Transform.Inverse.OfPoint(refPoint));
|
||||
if (proj == null)
|
||||
return null;
|
||||
return face.Face.ComputeNormal(proj.UVPoint).Negate().CrossProduct(curveTangent);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// function that tries to find the first intersection
|
||||
/// between the provided curve and one of the faces provided.
|
||||
/// </summary>
|
||||
/// <param name="curve">
|
||||
/// curve that is to be intersected with the faces provided
|
||||
/// </param>
|
||||
/// /// <param name="faces">
|
||||
/// list of faces that are used to find an intersection
|
||||
/// </param>
|
||||
/// /// <param name="intersection">
|
||||
/// output parameter to return the intersection point.
|
||||
/// </param>
|
||||
/// /// <param name="offsetFromFace">
|
||||
/// output parameter to return the offset value stored in Targetface that was used for intersection
|
||||
/// </param>
|
||||
/// <returns> true if an intersection was found, false otherwise</returns>
|
||||
private bool getIntersection(Curve curve, List<TargetFace> faces, out XYZ intersection, out double offsetFromFace)
|
||||
{
|
||||
intersection = new XYZ();
|
||||
offsetFromFace = 0.0;
|
||||
|
||||
foreach (TargetFace face in faces)
|
||||
{
|
||||
IntersectionResultArray results;
|
||||
Curve curveTrf = curve.CreateTransformed(face.Transform.Inverse);
|
||||
if (face.Face.Intersect(curveTrf, out results) == SetComparisonResult.Overlap)
|
||||
foreach (IntersectionResult result in results)
|
||||
{
|
||||
if (curveTrf.Project(result.XYZPoint).Parameter < 0)
|
||||
continue;
|
||||
intersection = face.Transform.OfPoint(result.XYZPoint);
|
||||
offsetFromFace = face.Offset;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function that generates the bars between the first and last bar of the set, according to the layout rule
|
||||
/// </summary>
|
||||
/// <param name="firstCurve"></param>
|
||||
/// <param name="lastCurve"></param>
|
||||
/// <param name="layout"></param>
|
||||
/// <param name="nbOfBars"></param>
|
||||
/// <param name="spacing"></param>
|
||||
/// <param name="curves"></param>
|
||||
/// <param name="overrideCurve"></param>
|
||||
/// <returns></returns>
|
||||
private bool generateSet(Curve firstCurve, Curve lastCurve, RebarLayoutRule layout, int nbOfBars, double spacing, ref List<Curve> curves, Curve overrideCurve)
|
||||
{
|
||||
try
|
||||
{
|
||||
Line startLine = Line.CreateBound(firstCurve.Evaluate(0, true), lastCurve.Evaluate(0, true));
|
||||
Line endLine = Line.CreateBound(firstCurve.Evaluate(1, true), lastCurve.Evaluate(1, true));
|
||||
int barNumber = nbOfBars - 2;
|
||||
//see how many bar we can fit
|
||||
int numberOfBarsWhichCanFit = (int)((startLine.Length - double.Epsilon) / spacing) + 2;
|
||||
if (layout == RebarLayoutRule.NumberWithSpacing && numberOfBarsWhichCanFit != nbOfBars) //check if required number of bars fits between ends
|
||||
return false;
|
||||
if (layout == RebarLayoutRule.MaximumSpacing ||
|
||||
layout == RebarLayoutRule.MinimumClearSpacing)
|
||||
barNumber = numberOfBarsWhichCanFit - 2;
|
||||
|
||||
double nEval = 0.0;
|
||||
for (int ii = 0; ii < barNumber; ii++)
|
||||
{
|
||||
nEval = (double)(ii + 1) / (double)(barNumber + 1);
|
||||
Curve newBar = (overrideCurve != null) ? overrideCurve.CreateTransformed(Transform.CreateTranslation(startLine.Evaluate(nEval, true) - overrideCurve.GetEndPoint(0)))
|
||||
: Line.CreateBound(startLine.Evaluate(nEval, true), endLine.Evaluate(nEval, true));
|
||||
curves.Add(newBar);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function that checks if two bars(Curves) have the same "direction"
|
||||
/// </summary>
|
||||
/// <param name="firstBar">bar that stays put, e.g. gives the wanted direction</param>
|
||||
/// <param name="secondBar">bar that flips if it's direction is not the same as the first</param>
|
||||
/// <returns></returns>
|
||||
private bool alignBars(ref Curve firstBar, ref Curve secondBar)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (firstBar.Evaluate(0, true).DistanceTo(secondBar.Evaluate(0, true)) >
|
||||
firstBar.Evaluate(0, true).DistanceTo(secondBar.Evaluate(1, true)))
|
||||
secondBar = Line.CreateBound(secondBar.GetEndPoint(1), secondBar.GetEndPoint(0));
|
||||
}
|
||||
catch { return false; }
|
||||
return true;
|
||||
}
|
||||
/// <summary>
|
||||
/// Function used to intersect 2 faces to obtain an offseted curve.
|
||||
/// </summary>
|
||||
/// <param name="firstFace"></param>
|
||||
/// <param name="secondFace"></param>
|
||||
/// <returns></returns>
|
||||
private Curve getOffsetCurveAtIntersection(TargetFace firstFace, TargetFace secondFace)
|
||||
{
|
||||
Curve firstCurve;
|
||||
FaceIntersectionFaceResult result = firstFace.Face.Intersect(secondFace.Face, out firstCurve);
|
||||
// if faces do not intersect, or do not return a Line, then consider the input invalid and return error
|
||||
if (result == FaceIntersectionFaceResult.NonIntersecting || !(firstCurve is Line))
|
||||
return null;
|
||||
XYZ pointOnCurve = firstCurve.Evaluate(0, true);
|
||||
XYZ FirstOffsetVec = firstFace.Face.ComputeNormal(firstFace.Face.Project(pointOnCurve).UVPoint).Normalize();
|
||||
XYZ SecondOffsetVec = secondFace.Face.ComputeNormal(secondFace.Face.Project(pointOnCurve).UVPoint).Normalize();
|
||||
XYZ offsetVec = (FirstOffsetVec * firstFace.Offset) + (SecondOffsetVec * secondFace.Offset);
|
||||
Transform offsetTrf = Transform.CreateTranslation(offsetVec);
|
||||
return firstCurve.CreateTransformed(offsetTrf.Multiply(firstFace.Transform));
|
||||
}
|
||||
/// <summary>
|
||||
/// function that iterates through a geometry element to get all the faces it is composed of
|
||||
/// </summary>
|
||||
/// <param name="geometryElement">
|
||||
/// element that needs to be parsed to fetch all the faces
|
||||
/// </param>
|
||||
/// /// <param name="trf">
|
||||
/// transform of the geometry element provided.
|
||||
/// this is applicable for geometries that come from familyInstance
|
||||
/// </param>
|
||||
/// <returns> list of faces that make up the provided element </returns>
|
||||
private List<TargetFace> getFacesFromElement(GeometryElement geometryElement, Transform trf = null)
|
||||
{
|
||||
List<TargetFace> result = new List<TargetFace>();
|
||||
if (geometryElement != null)
|
||||
{
|
||||
foreach (GeometryObject geometryObject in geometryElement)
|
||||
{
|
||||
Solid solid = geometryObject as Solid;
|
||||
if (solid == null)
|
||||
{
|
||||
GeometryInstance geometryInstance = geometryObject as GeometryInstance;
|
||||
if (geometryInstance != null)
|
||||
{
|
||||
Transform transform = geometryInstance.Transform;
|
||||
List<TargetFace> nestedFaces = getFacesFromElement(geometryInstance.SymbolGeometry, transform);
|
||||
if (nestedFaces == null)
|
||||
return null;
|
||||
foreach (TargetFace nestedFace in nestedFaces)
|
||||
result.Add(nestedFace);
|
||||
}
|
||||
}
|
||||
else
|
||||
foreach (Face face in solid.Faces)
|
||||
result.Add(new TargetFace() { Face = face, Transform = (trf == null) ? Transform.Identity : trf });
|
||||
}
|
||||
}
|
||||
return result.Count > 0 ? result : null;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user