CompositeParts zählen

Fragen, Anmerkungen und Hilfestellung zu DESITE MD/CUSTOM/SHARE

CompositeParts zählen

Beitragvon Precaster » Mi 20. Apr 2016, 06:38

Guten Morgen zusammen,

ich möchte gerne ein Türlistenformular mit desite erstellen. Da Türen ja meistens als Composites kommen stelle ich mir eine dynamische Tabelle wie folgt vor:

TürName1(Composite)
Türblatt (Part of Composite)
Oberlicht (Part of Composite)
Klinke (Part of Composite)

TürName2(Composite)
Türblatt (Part of Composite)
Oberlicht (Part of Composite)
Klinke (Part of Composite)


Der CompositeName soll als "Header" dienen und die Parts darunter aufgelistet werden.
Dafür müsste ich aber erstmal zählen wieviele Parts der Composite überhaupt hat oder? Ich finde jedoch keine Eigenschaft, welche die Anzahl der Parts ausweist.

oder müsste ich das über den Objekt-Iterator machen? Das würde allerdings auf die Performence gehen.

Code: Alles auswählen
if (cpIsComposite == true)
{
desiteAPI.itByFilter( "cpID", "xs:ID", selected + "*");
var st = desiteAPI.itCount;
for (i=0; i<st; i++)
{
var id = desiteAPI.itNext();
name = desiteAPI.getPropertyValue( objectID, "cpName", "xs:string");
}
}


oder gibt es eine bessere Möglichkeit?

Achja....ich habe in den Optionen bei "Teile von Compositen selektieren" deaktiviert. Ich selektiere also immer nur den Composite selber (grüne Selektionsfarbe)

Besten Dank für Tipps und Tricks

mfg
Precaster
Precaster
 
Beiträge: 101
Registriert: Mo 8. Dez 2014, 07:31

Re: CompositeParts zählen

Beitragvon jochen.hanff » Do 21. Apr 2016, 11:54

- der objekt-iterator ist in den meisten fällen keine schlechte wahl, weil man damit
objekte filtern kann ohne die sichtbarkeit zu verändern. die performance
sollte nicht schlechter sein als bei 'filterElements()'

- helfen kann die eigenschaft: cpCompositeID
der wert ist für alle objekte in einem composite gleich.

- mit der funktion getContainedElements() kann man die subbauteile eines
composite abfragen

gruß
jh
jochen.hanff
 
Beiträge: 182
Registriert: Do 4. Dez 2014, 18:46
Wohnort: Essen

Re: CompositeParts zählen

Beitragvon paul.stelter » Mi 12. Dez 2018, 14:53

Moin,

hierzu hätte ich auch noch eine Frage, da mir das Vorgehen des iterativen Herausfilterns nicht ganz klar geworden ist.

Kurze Erklärung der gewünschten Anwendung (siehe auch Bild im Anhang):
- Erstellung eines LV's mit Mengenermittlung in Extraspalte "Menge".
- Bei Betonplatten interessiert mich zum Beispiel das Betonvolumen. Bei Fenstern die Stückzahl. Für letztere ermittle ich die gesuchte Menge daher mit der Formel:

Code: Alles auswählen
=SUM_LINKED([[cpCount##xs:long##geometry]])


- Fenster sind jedoch in der Regel Composite-Bauteile aus n-Bauteilen. So erhalte ich am Ende leider die n-fache Stückzahl.
- Um die korrekte Menge zu erhalten könnte ich nun die ermittelte Menge durch "n" teilen. Dies Stimmt jedoch nur bedingt, wenn es sich um immer die gleichen Fenster mit der selben Anzahl der Composite-Bauteile handelt.
-Daher würde ich gerne, die jeweilige Anzahl der Composite-Bauteile in eine Variable (zb. "stk") schreiben lassen, und die Menge durch diese Variable teilen.

Code: Alles auswählen
=SUM_LINKED([[cpCount##xs:long##geometry]]/[[stk##xs:double##geometry]])


-Hierzu habe ich ein (Objekt-)Skript geschrieben, bei dem ich mich an den Code von Precaster (s. erster Beitrag) orientiert habe:

Code: Alles auswählen
if (cpIsComposite == true)
{
desiteAPI.itByFilter( "CompositeID", "xs:ID" );
var stk = desiteAPI.itCount;
for (i=0; i<stk; i++);
}


- Das muss offensichtlich falsch sein, da nun zum einen auch Nicht-Composite-Bauteile die Eigenschaftsvariable "stk" bekommen haben. Zudem ist der Wert immer mit "0" angegeben. Auch bei Composite-Bauteilen.

Nun bin ich mir nicht sicher, wie das Objekt-Skript arbeitet. Wenn das Skript nur auf ein einzelnes Objekt bezogen wird, dann müsste die iterative Zählung immer den Wert "1" ergeben. Also nur sich selber zählen. Oder Wird dann objektübergreifend beim nächsten Objekt mit der gleichen CompositeID der Zähler auf "2" gesetzt?

Eigentlich ermittel DESITE die Anzahl der Compositebauteile schon, denn wenn man die Eigenschaften einen Composites mit "i" einblendet, wird oben rechts im Fenster die Anzahl ausgegeben. Wird diese Zahl von DESITE erst in diesem Moment ermittelt, oder gibt es dafür bereits eine Variable, auf die man zugreifen kann?

Außerdem habe ich hier irgendwo gelesen (und ich erinnere mich schwach an die alten DOS-Zeiten), dass solche skripte immer mit einem "clear" anfangen sollten, um die Zähler immer wieder zu "nullen". Hier dann wohl mit
"itclear()"? Und wenn ja, wie wende ich diesen Befehl im oben genannten Skript korrekt an?

Im Anhang ist noch ein Screenshot vom LV mit dem Beispiel der Oberlichter. Es sind 10Stk im Modell vorhanden. Da ein Oberlicht aus 3 Composite-Bauteilen besteht und zusätzlich das Composite als ganzes hinzugezählt wird (=4) werden hier insgesamt 4*10Stk=40Stk ermittelt.
In der Bauteil-Info wir die mittels Skript erzeugte Variable "stk" mit "0" anstelle der erwarteten "4" angegeben.

Kann mir hier jemand weiterhelfen? Vielleicht versuche ich das Problem auch sehr umständlich zu lösen und es gäbe eine ganz andere Lösung?

Mit freundlichen Grüßen,

Paul Stelter
Dateianhänge
Composite.jpg
Im Anhang ist noch ein Screenshot vom LV mit dem Beispiel der Oberlichter. Es sind 10Stk im Modell vorhanden. Da ein Oberlicht aus 3 Composite-Bauteilen besteht und zusätzlich das Composite als ganzes hinzugezählt wird (=4) werden hier insgesamt 4*10Stk=40Stk ermittelt.
In der Bauteil-Info wir die mittels Skript erzeugte Variable "stk" mit "0" anstelle der erwarteten "4" angegeben.
paul.stelter
 
Beiträge: 2
Registriert: Mi 12. Dez 2018, 13:49

Re: CompositeParts zählen

Beitragvon paul.stelter » Do 13. Dez 2018, 23:02

Ok, meine Skript-Künste sind wahrlich nicht die größten...
Habe das Skript noch einmal überdacht und hoffentlich nicht verschlimmbessert:

Code: Alles auswählen
var IsComposite = desiteAPI.getPropertyValue(desiteThis.ID(), 'cpIsComposite', 'xs:boolean');
var CompositeID = desiteAPI.getPropertyValue(desiteThis.ID(), 'cpCompositeID', 'xs:ID');

if (IsComposite == true)
{
desiteAPI.itByFilter( 'CompositeID', 'xs:ID' );
var stk = desiteAPI.itCount;
for (i=0; i<stk; i++);
}


Nun werden immerhin nur noch Composite-Bauteile bearbeitet. Der ausgegebene Wert bleibt jedoch trotzdem auf "0".
Die Filter- und Zählfunktion scheint also noch etwas überarbeitet werden zu müssen.

Bin weiterhin auf Ratschläge gespannt,

Gruß,
Paul Stelter
paul.stelter
 
Beiträge: 2
Registriert: Mi 12. Dez 2018, 13:49

Re: CompositeParts zählen

Beitragvon jochen.hanff » Di 1. Jan 2019, 18:20

hallo,
am einfachsten wäre es hier, ein neues attribut mit einem prop-skript zu erstellen, das eine 1 als counter zurückgibt. aber nur, wenn
es sich bei dem bauteil um ein composite handelt oder um ein bauteil, das nicht teil eines comp ist. sonst ist der attributwert = 0.

Code: Alles auswählen
var id = desiteThis.ID();
var isComp      = desiteAPI.getPropertyValue( id, 'cpIsComposite', 'xs:boolean');
var isPartComp  = desiteAPI.getPropertyValue( id, 'cpIsPartOfComposite', 'xs:boolean');
var result = 0;
if( isComp == true || isPartComp == false ) {
   result = 1;
}
result;


gruß
jh
jochen.hanff
 
Beiträge: 182
Registriert: Do 4. Dez 2014, 18:46
Wohnort: Essen


Zurück zu DESITE MD / CUSTOM / SHARE

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste

cron