Implementieren Sie die IRule-Schnittstelle, um benutzerdefinierte Verbindungen für Advance Steel erstellen zu können.
Die IRule-Schnittstelle ist in der Bibliothek ASObjectsMgd.dll definiert. Sie enthält Methoden und Eigenschaften, die zur Definition von Advance Steel-Verbindungen erforderlich sind.
Diese Eigenschaft stellt eine ObjectId zur Identifizierung der Verbindung bereit. Für diese Eigenschaft wird lediglich eine einfache automatische Implementierung benötigt.
|
Code-Region: JointId implementieren |
public Autodesk.AdvanceSteel.CADLink.Database.ObjectId JointId { get; set; }
|
Dies ist die Methode, mit der die Eingabeelemente der Verbindung definiert werden. Es kann sich bei diesen um jedes beliebige Autodesk.AdvanceSteel.CADAccess.FilerObject wie Träger, Platten oder Punkte handeln. Die Methode Query erfordert einen IUI-Eingabeparameter, damit der Benutzer die Eingabeobjekte auswählen kann. Diese Eingabeobjekte müssen einem IJoint mit der Methode Query hinzugefügt werden, um später beim Erstellen der Verbindung referenziert werden zu können.
Im folgenden Beispiel wird der Benutzer aufgefordert, eine Platte und einen Träger zur Nutzung in der Verbindung auszuwählen. Die FilerObjects werden dann mithilfe der Methode setInputObjects () im IJoint eingerichtet. Beachten Sie, dass der IJoint durch die JointId referenziert wird.
|
Code-Region: Query implementieren |
public void Query(IUI ui)
{
eUIErrorCodes errCodePlate, errCodeBeam;
FilerObject beam, mainplate;
mainplate = ui.AcquireSingleObjectWithKeywords(90279, out errCodePlate); // select main plate
beam = ui.AcquireSingleObjectWithKeywords(90284, out errCodeBeam); // select connecting object
if (errCodePlate == eUIErrorCodes.kUINormal && errCodeBeam == eUIErrorCodes.kUINormal)
{
IJoint joint = DatabaseManager.Open(JointId) as IJoint;
if (null != joint)
{
joint.setInputObjects(new FilerObject[] { mainplate, beam }, new int[] { 1, 1 });
}
}
}
|
Dies ist eine optionale Methode. Sie ist hilfreich, wenn eine Tabelle in der AstorRules-Datenbank definiert wird, in der vordefinierte Werte für die Verbindung gespeichert werden. Wenn sie nicht benötigt werden, wird eine leere Zeichenfolge zurückgegeben.
|
Code-Region: GetTableName implementieren |
public string GetTableName()
{
return "";
}
|
Diese Methode wird verwendet, wenn vom Benutzer änderbare Parameter zur Steuerung des Verbindungsverhaltens definiert werden. Diese Methode besitzt einen IRuleUIBuilder-Eingabeparameter, mit dem sich benutzerdefinierte Steuerelemente zur Regelseiten-UI hinzufügen lassen. Sie können zunächst die Seiten und anschließend Steuerelemente für jede Seite definieren. Die Steuerelemente können einfache Textfelder und Kontrollkästchen oder auch komplexere Steuerelemente wie die Schraubenauswahl oder andere benutzerdefinierte Auswahlmöglichkeiten sein. (Die Auswahlen sind Dropdown-Listen mit zwei oder mehr Optionen.)
Beachten Sie, dass die Namen der für die Regelseiten definierten Steuerelemente identisch mit den Namen sein müssen, die für die Parameter in den Methoden Save() und Load() verwendet werden (siehe unten).
Mit dem folgenden Code wird eine einzelne Seite erstellt, die mehrere vom Benutzer definierbare Parameter zum Erstellen der Verbindung enthält.
|
Code-Region: GetRulePages implementieren |
public void GetRulePages(IRuleUIBuilder builder)
{
builder.SheetDimension = IRuleUIBuilder.eSheetDimension.kStandard;
int pageNo = builder.BuildRulePage(89954, -1, 60601); // no group, page title and bitmap are copied from an ApexAntiSag page
builder.AddSelectorCustom(pageNo, "_connector", "_connector", typeof(int), new string[] { "Bolt", "Anchor", "Hole" });
builder.AddSelectorCustom(pageNo, "_reference", "_reference", typeof(int), new string[] { "Intersection area", "Plate" });
builder.AddSelectorCustom(pageNo, "_layout", "_layout", typeof(int), new string[] { "Centered", "Edge" });
builder.AddTextBox(pageNo, "_numBoltsXDir", "_numBoltsXDir", typeof(int));
builder.AddTextBox(pageNo, "_numBoltsYDir", "_numBoltsYDir", typeof(int));
builder.AddTextBox(pageNo, "_intermediateDistX", "_intermediateDistX", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_intermediateDistY", "_intermediateDistY", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_offsetX", "_offsetX", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_offsetY", "_offsetY", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_edge1", "_edge1", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_edge2", "_edge2", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_edge3", "_edge3", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddTextBox(pageNo, "_edge4", "_edge4", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
builder.AddSelectorCustom(pageNo, "_stagger", "_stagger", typeof(int), new string[] { "One direction", "Other direction" });
builder.AddTextBox(pageNo, "_staggerDist", "_staggerDist", typeof(double), Autodesk.AdvanceSteel.DotNetRoots.Units.Unit.eUnitType.kDistance);
}
|
Diese Methoden werden verwendet, um auf Regelseiten angezeigte Parameter zur Verbindungsdefinition zu speichern und zu laden. Bei den über diese Schnittstellenmethoden gespeicherten und geladenen Werten handelt es sich um Werte, die auch zur Regelseiten-UI gehören. Die Namen sollten daher den für die IRuleUIBuilder-Schnittstelle von GetRulePages() verwendeten Namen entsprechen. Die Werte werden aus einem IFiler-Objekt gelesen bzw. in dieses geschrieben.
Im folgenden Code stammen die gespeicherten und ausgelesenen Werte aus Mitgliedervariablen der bei der Implementierung der IRule -Schnittstelle verwendeten Klasse.
|
Code-Region: Save und Load implementieren |
public void Save(IFiler filer)
{
filer.WriteVersion(1);
filer.WriteItem(_numBoltsXDir, "_numBoltsXDir");
filer.WriteItem(_numBoltsYDir, "_numBoltsYDir");
filer.WriteItem(_intermediateDistX, "_intermediateDistX");
filer.WriteItem(_intermediateDistY, "_intermediateDistY");
filer.WriteItem(_offsetX, "_offsetX");
filer.WriteItem(_offsetY, "_offsetY");
filer.WriteItem(_staggerDist, "_staggerDist");
filer.WriteItem(_edge1, "_edge1");
filer.WriteItem(_edge2, "_edge2");
filer.WriteItem(_edge3, "_edge3");
filer.WriteItem(_edge4, "_edge4");
filer.WriteItem(_layout, "_layout");
filer.WriteItem(_connector, "_connector");
filer.WriteItem(_reference, "_reference");
filer.WriteItem(_stagger, "_stagger");
}
public void Load(IFiler filer)
{
_numBoltsXDir = (int)filer.ReadItem("_numBoltsXDir");
_numBoltsYDir = (int)filer.ReadItem("_numBoltsYDir");
_intermediateDistX = (double)filer.ReadItem("_intermediateDistX");
_intermediateDistY = (double)filer.ReadItem("_intermediateDistY");
_offsetX = (double)filer.ReadItem("_offsetX");
_offsetY = (double)filer.ReadItem("_offsetY");
_staggerDist = (double)filer.ReadItem("_staggerDist");
_edge1 = (double)filer.ReadItem("_edge1");
_edge2 = (double)filer.ReadItem("_edge2");
_edge3 = (double)filer.ReadItem("_edge3");
_edge4 = (double)filer.ReadItem("_edge4");
_layout = (int)filer.ReadItem("_layout");
_connector = (int)filer.ReadItem("_connector");
_reference = (int)filer.ReadItem("_reference");
_stagger = (int)filer.ReadItem("_stagger");
}
|
Dies ist die Methode, mit der alle Berechnungen sowie Objekterstellung und Änderungen durchgeführt werden. Die Methode Query() wurde bereits aufgerufen, sodass die Eingabeelemente im IJoint-Objekt verfügbar sind. Aus den Eingabeelementen und den benutzerdefinierbaren Parametern werden die Anschlussobjekte erstellt und dem IJoint mithilfe der Methode setCreatedObjects() hinzugefügt.
|
Code-Region: CreateObjects implementieren |
public void CreateObjects()
{
// get my start points
IJoint joint = DatabaseManager.Open(JointId) as IJoint;
IEnumerable<FilerObject> input = joint.InputObjects;
// prepare the output
List<CreatedObjectInformation> arrCOI = new List<CreatedObjectInformation>();
// TODO: Create objects and put in arrCOI list
// created objects need to be set to the joint
joint.setCreatedObjects(arrCOI, true);
}
|