| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: Block InsertionPoint (1799 mal gelesen)
|
H.D. Mitglied
Beiträge: 25 Registriert: 12.05.2005 P4 3.20 GHz 1,00 GB RAM WinXP SP2 Autodesk Architectural Desktop 2004
|
erstellt am: 06. Okt. 2005 16:09 <-- editieren / zitieren --> Unities abgeben:
Hello everybody! Hab mal wieder ein kleines Problem mit einem Block! Ich will auf eine modifikation in einer Zeichnung reagieren. Und zwar wenn ein Block bewegt wird will ich kontrollieren, ob dieser in einem anderen Bereich der Zeichnung plaziert werden darf. Dabei soll der Block "Grob" in der Zeichung plaziert werden können. Per VBA will ich die fein Justierung durchführen. Mein Problem liegt darin das ich den geänderten InsertionPoint meiner Blockreferenz nicht zuweisen kann. Private Sub AcadDocument_ObjectModified(ByVal Object As Object) Dim Point1 as variant Dim Point2(2) as double dim dx as long dim dy as long dim dz as long
'InsertionPoint auslesen: Point1 = Object.InsertionPoint 'Manipulation der Koordinaten Point2(0) = Point1(0) + dx Point2(1) = Point1(1) + dy Point2(2) = Point1(2) + dz 'Neuen InsertionPoint zuweisen Object.InsertionPoint = Point2 '<==== Problem!!! ??? end sub In der AutoCAD hilfe steht das der InsertionPoint Read und Write fähig ist, auch für AcadBlockReferenzen. Warum funzt es nicht bei mir? Gruss H.D. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 06. Okt. 2005 20:33 <-- editieren / zitieren --> Unities abgeben: Nur für H.D.
Hi H.D., ich weiss es nicht, denke aber mal, dass das Event _ObjectModified objektbezogen Readonly zugreift. Zumindest lautet der Fehler so ähnlich. Reine Vermutung: IMHO würdest Du ja sonst eine Kettenreaktion auslösen, da das Ändern des InsertionPoints wiederum ein ObjectModified auslöst, was seinerseits ein ObjectModified auslöst, was wiederum ein ObjectModified ... usw.usf. bitteres Ende: Endlosschleife/nicht genügend Stapelspeicher/c'est lavie oder so;-) Aber wiegesagt, nur Vermutung, kann auch falsch liegen, keine Ahnung. gruss Nancy -- Error 032: Recursion error - see error 032. ;-) [Diese Nachricht wurde von startrek am 06. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
H.D. Mitglied
Beiträge: 25 Registriert: 12.05.2005 P4 3.20 GHz 1,00 GB RAM WinXP SP2 Autodesk Architectural Desktop 2004
|
erstellt am: 07. Okt. 2005 08:25 <-- editieren / zitieren --> Unities abgeben:
Moin, Danke für Deine Antwort Nancy! Die Frage die ich mir jetzt stelle ist: Wann wird der Interrupt ausgelöst? Wird dieser ausgelöst bei einer reinen Zuweisung also auch wenn Point1 = Point2 ist oder erst dann wenn Point1 <> Point2 ist? Vielleicht weiss jemand von Euch eine Antwort. Gruss H.D.
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fuchsi Mitglied Programmierer c#.net Datawarehouse
Beiträge: 1201 Registriert: 14.10.2003 AutoCad Version 2012 deu/enu <P>Windows 7 64bit
|
erstellt am: 07. Okt. 2005 12:10 <-- editieren / zitieren --> Unities abgeben: Nur für H.D.
startreck hat recht. Du darfst in einem Reaktor nichts machen, was wiederum den selben Reaktor auslösen könnte. d.h. Im Reaktor ObjectModified darfst du das selbe Objkte (das den Reaktor ausgelöst hat) nicht wieder ändern. Du könntest da eher mit einem Editor Reaktor arbeiten command-WillStart, Command-Ended und Command-Cancelled und analysieren welchen Befehl der Benutzer aufgerufen hat und welche Objekte damit betroffen sind und danach den Block positionieren Ist zwar ein merklich höherer Aufwand, aber aus meiner Sicht die einzige Möglichkeit ein geändertes Objekt nochmal mittels Reaktor zu ändern
------------------ Ing. Anton Fuchs WWW.FFZELL.AT.TC Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 07. Okt. 2005 21:29 <-- editieren / zitieren --> Unities abgeben: Nur für H.D.
Zitat: Original erstellt von H.D.: Wird dieser ausgelöst bei einer reinen Zuweisung also auch wenn Point1 = Point2 ist oder erst dann wenn Point1 <> Point2 ist?
das lässt sich doch recht simpel testen;-) Ja - es crasht auch wenn Point1() = Point2(), alldieweil zwar die Punktkoordinaten deckungsgleich sein mögen, aber es wird trotzdem als 'write' interpretiert, auch wenns haargenau dasselbe ist. Versuch dich auf Umwege da ranzuhangeln, mit _ObjectModified() wirste da wahrscheinlich nicht so richtig glücklich werden - siehe fuchsi Nicht mal sowas geht:
Code:
Option ExplicitPrivate Sub AcadDocument_ObjectModified(ByVal Object As Object) Dim Point1 As Variant Dim dx#, dy#, dz# dx = 50: dy = 50: dz = 50 'InsertionPoint auslesen: Point1 = Object.InsertionPoint 'Manipulation der Koordinaten Point2(0) = Point1(0) ' + dx Point2(1) = Point1(1) ' + dy Point2(2) = Point1(2) ' + dz 'On Error Resume Next If CDbl(Point1(0)) = Point2(0) And CDbl(Point1(1)) = Point2(1) _ And CDbl(Point1(2)) = Point2(2) Then Debug.Print Point2(0), Point2(1), Point2(2) Exit Sub Else Set dummy = Object Call x End If End Sub Sub x() On Error Resume Next dummy.InsertionPoint = Point2 Debug.Print Point2(0), Point2(1), Point2(2) End Sub
@fuchsi, alder schlumbi , dös nächste Moal schreibst mi richtig, oder glei Nancy ;;-))) lg Nancy
[Diese Nachricht wurde von startrek am 07. Okt. 2005 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
H.D. Mitglied
Beiträge: 25 Registriert: 12.05.2005 P4 3.20 GHz 1,00 GB RAM WinXP SP2 Autodesk Architectural Desktop 2004
|
erstellt am: 08. Okt. 2005 10:40 <-- editieren / zitieren --> Unities abgeben:
|
Stelli1 Moderator Verm.-Ing.
Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 16. Okt. 2005 17:15 <-- editieren / zitieren --> Unities abgeben: Nur für H.D.
Hallo H.D. führe doch einfach mit Code:
Static vlbo_CodeEvent as booleanif vlbo_CodeEvent = true ' Mach nichts vlbo_CodeEvent=false else vlbo_CodeEvent=true ' dein Code end if
ein Flag ein. Hiermit kannst du steuern ob der Code durch ein verschieben oder durch deinen eigenen Code ausgelöst wurde. Stelli ------------------ Warum lisp'eln wenn's auch anders geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |