| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: iProperty zuweisen nur mit Sub? (1797 mal gelesen)
|
Doc Snyder Ehrenmitglied V.I.P. h.c. Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen
Beiträge: 13115 Registriert: 02.04.2004 AIP2013SP2.2 XPproSP2 MS-IntelliMouse-Optical SpacePilot DellM4600 2,13GHz 2GB FxGo1400 1920x1200 am Dock Dell2711
|
erstellt am: 18. Okt. 2009 23:21 <-- editieren / zitieren --> Unities abgeben:
Moin! Ich habe mir grad aus verschiedenen zusammengeschnorrten Code-Schnipseln ein RangeBox-Makro zusammengebastelt, und das geht sogar . Nur verstehe ich nicht, warum von den folgenden zwei, mir gleichwertig erscheinenden Code-Varianten nur die erste funktioniert: So geht es (so hat es ja auch Igor mir gezeigt ):
Code: Sub BoxDimensions() If ThisApplication.ActiveDocumentType <> kPartDocumentObject Then MsgBox "Geht nur im einzeln geöffneten Bauteil (ipt)!" Exit Sub End If Dim oPart As PartDocument Set oPart = ThisApplication.ActiveDocument Dim sBox As String Dim dX As Double Dim dY As Double Dim dZ As Double dX = Round((oPart.ComponentDefinition.RangeBox.MaxPoint.X - oPart.ComponentDefinition.RangeBox.MinPoint.X), 4) dY = Round((oPart.ComponentDefinition.RangeBox.MaxPoint.Y - oPart.ComponentDefinition.RangeBox.MinPoint.Y), 4) dZ = Round((oPart.ComponentDefinition.RangeBox.MaxPoint.Z - oPart.ComponentDefinition.RangeBox.MinPoint.Z), 4) sBox = dX * 10 & " x " & dY * 10 & " x " & dZ * 10 Call SetPropertyValueBox(oPart.PropertySets(4), sBox) End SubPrivate Sub SetPropertyValueBox(oPropset As PropertySet, sBox As String) On Error Resume Next If oPropset.Item("Box").Name <> "Box" Then Call oPropset.Add("", "Box") oPropset.Item("Box").Value = sBox Else If oPropset.Item("Box").Value <> sBox Then oPropset.Item("Box").Value = sBox End If End If MsgBox "Box = " & sBox End Sub
Und so geht es nicht (ich möchte die Private Sub einsparen, deren Sinn ich nicht erkenne):
Code: Sub BoxDimensions2() If ThisApplication.ActiveDocumentType <> kPartDocumentObject Then MsgBox "Geht nur im einzeln geöffneten Bauteil (ipt)!" Exit Sub End If Dim oPart As PartDocument Set oPart = ThisApplication.ActiveDocument Dim oPropset As PropertySet Dim sBox As String Dim dX As Double Dim dY As Double Dim dZ As Double dX = Round((oPart.ComponentDefinition.RangeBox.MaxPoint.X - oPart.ComponentDefinition.RangeBox.MinPoint.X), 6) dY = Round((oPart.ComponentDefinition.RangeBox.MaxPoint.Y - oPart.ComponentDefinition.RangeBox.MinPoint.Y), 6) dZ = Round((oPart.ComponentDefinition.RangeBox.MaxPoint.Z - oPart.ComponentDefinition.RangeBox.MinPoint.Z), 6) sBox = dX * 10 & " x " & dY * 10 & " x " & dZ * 10 If oPart.PropertySets(4).Item("Box").Name <> "Box" Then Call oPart.PropertySets(4).Add("", "Box") oPart.PropertySets(4).Item("Box").Value = sBox Else If oPart.PropertySets(4).Item("Box").Value <> sBox Then oPart.PropertySets(4).Item("Box").Value = sBox End If End If MsgBox "Box = " & sBox End Sub
Kann mir das vielleicht jemand erklären? ------------------ Roland www.Das-Entwicklungsbuero.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
rtend12 Mitglied Dipl.-Ing. (FH) Maschinenbau / Konstrukteur
Beiträge: 436 Registriert: 21.07.2004 Catia V5 (R16SP5, B18SP5) VB.Net 2003
|
erstellt am: 18. Okt. 2009 23:45 <-- editieren / zitieren --> Unities abgeben: Nur für Doc Snyder
Hallo Roland, deklariere Dein PropertySet in Deiner Sub und es sollte gehen. In dem Code mit 2 Subs wird das PropertySet an sie 2. Sub übergeben und steht somit als Object zur Verfügung. In dem anderen Code versuchst Du es ohne Deklaration. Allerdings mußte ich nach einem Test gerade feststellen, dass auch der erste Code funktioniert. Was geht denn bei Dir nicht? Gruß Reinhard Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Doc Snyder Ehrenmitglied V.I.P. h.c. Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen
Beiträge: 13115 Registriert: 02.04.2004 AIP2013SP2.2 XPproSP2 MS-IntelliMouse-Optical SpacePilot DellM4600 2,13GHz 2GB FxGo1400 1920x1200 am Dock Dell2711
|
erstellt am: 19. Okt. 2009 00:31 <-- editieren / zitieren --> Unities abgeben:
Hi! Der Knackpunkt liegt glaub ich hier:
Code: Call oPart.PropertySets(4).Add("", "Box")
(in dem Block "Wenn iProperty "Box" noch nicht vorhanden") Ist das iProp nicht vorhanden, gibt es den abgebildeten Mecker. Ist Code1 1x gelaufen und nur eine Änderung zu aktualisieren (also Else an der Stelle), dann geht es. Wenn ich voher das iProp "Box" von Hand anlege, läuft es allerdings auch nicht. Zur Deklaration: IMHO habe ich in dem Code2 die Deklaration vorgenommen, halte das aber trotzdem für überflüssig, da ich dort diese Variable überhaupt nicht verwende, sondern sie nur als Unterpunkt zu oPart. anspreche, und ebenda vermute ich das Problem. Vermutlich tuts in dieser Form das Call nicht. ------------------ Roland www.Das-Entwicklungsbuero.de
[Diese Nachricht wurde von Doc Snyder am 19. Okt. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 19. Okt. 2009 01:28 <-- editieren / zitieren --> Unities abgeben: Nur für Doc Snyder
Zitat: Original erstellt von Doc Snyder: ich möchte die Private Sub einsparen, deren Sinn ich nicht erkenne
Moin Roland, als Konstrukteur verbaust du deine Bauteile auch in logisch zusammenhängenden Baugruppen. So ähnlich ist es auch in der Programmierwelt (Werte berechnen, Werte setzen, blah...). Der Stil den du anstrebst ähnelt einer Baugruppe mit 1000 Bauteilen und keinen Unterbaugruppen ------------------ Grüße Igor FX64 Software Solutions - Inventor Tools Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Doc Snyder Ehrenmitglied V.I.P. h.c. Dr.-Ing. Maschinenbau, Entwicklung & Konstruktion von Spezialmaschinen
Beiträge: 13115 Registriert: 02.04.2004 AIP2013SP2.2 XPproSP2 MS-IntelliMouse-Optical SpacePilot DellM4600 2,13GHz 2GB FxGo1400 1920x1200 am Dock Dell2711
|
erstellt am: 19. Okt. 2009 02:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Igor! Au ja, bring Du mir das Konstruieren bei! Eine Unterbaugruppe ist erst dann richtig sinnvoll, wenn sie mehr als ein Mal angewendet wird oder wenn es sonst zu viel wird. Das ist hier beides nicht der Fall! Sag mir doch bitte lieber, warum das in dem zweiten Beispiel nicht geht. ------------------ Roland www.Das-Entwicklungsbuero.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 19. Okt. 2009 09:18 <-- editieren / zitieren --> Unities abgeben: Nur für Doc Snyder
Zitat: Original erstellt von Doc Snyder: Hallo Igor! Au ja, bring Du mir das Konstruieren bei!
Hatte ich gar nicht vor?! Ist wohl schon zu spät? ;) Zitat: Original erstellt von Doc Snyder: Eine Unterbaugruppe ist erst dann richtig sinnvoll, wenn sie mehr als ein Mal angewendet wird oder wenn es sonst zu viel wird. Das ist hier beides nicht der Fall!
Eine Eigenschaft setzen ist so ziemlich das häufigste was in der Inventor Programmierung vorkommen kann. Da bleib ich bei dem Vergleich mit den Baugruppen. Zitat: Original erstellt von Doc Snyder:
Sag mir doch bitte lieber, warum das in dem zweiten Beispiel nicht geht.
Ja, du sollst nicht die Zeilen entfernen deren Bedeutung du nicht kennst Wie z.B. On Error Resume Next Aber das ist eh VBA und daher wie der Leo sagen würde "murkso grande". Alleine die Bedingung die wir prüfen im 'If' macht nicht viel Sinn, aber wer weiß welchen Sonderfall ich da umgehen wollte... ------------------ Grüße Igor
FX64 Software Solutions - Inventor Tools Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
pd65 Mitglied
Beiträge: 83 Registriert: 01.06.2004 Windows 7 pro (64); IV 2009 pro; SP2
|
erstellt am: 27. Okt. 2009 13:46 <-- editieren / zitieren --> Unities abgeben: Nur für Doc Snyder
Hallo, ist euch schon aufgefallen, daß die Ermittlung der Bauteilgrenzen auch die Größe einer vorhandenen Arbeitsebene mitnimmt? Wenn die Arbeitsebene "unsichtbar" geschalten ist, dann stimmts. Gibts denn da eine Möglichkeit nur den Volumenkörper zu ermitteln, bzw. zuerst alle Arbeitselemente auszuschalten? Beste Grüße Peter [Diese Nachricht wurde von pd65 am 27. Okt. 2009 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
daywa1k3r Moderator Softwareentwickler
Beiträge: 3497 Registriert: 01.08.2002 Alienware m17x, Win7, Inventor2012
|
erstellt am: 27. Okt. 2009 13:58 <-- editieren / zitieren --> Unities abgeben: Nur für Doc Snyder
|