| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Problem mit IntersectWith bei Block (1763 mal gelesen)
|
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 04. Aug. 2010 10:02 <-- editieren / zitieren --> Unities abgeben:
Hallo miteinander, ich brauche den Schnittpunkt einer Linien und eines eingefügten Blocks. Unter http://ww3.cad.de/foren/ubb/Forum259/HTML/000513.shtml#000001 habe ich einen Ansatz gefunden, der auch funktioniert, wenn der eingefügte Block aus einer einfachen Linie besteht. Meine Blöcke sind aber alles Polylinien. Nun erhalte ich in der IntersectWith-Zeile immer die Fehlermeldung: Fehler 445 (Object doesn't support this action) Kann mir bitte jemand weiterhelfen? Mit freundlichen Grüßen der Gemütsmensch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 04. Aug. 2010 17:16 <-- editieren / zitieren --> Unities abgeben:
Hallo! Inzwischen habe ich herausgefunden, daß es gar nicht an den Blöcken liegt, sondern daß auch mit Polylinien kein "IntersectWith" möglich ist. Hier ein Stück Code zum Testen:
Code: Dim Punkte(0 To 8) As Double Punkte(0) = 3: Punkte(1) = 0: Punkte(2) = 0 Punkte(3) = 3: Punkte(4) = 10: Punkte(5) = 0 Punkte(6) = 20: Punkte(7) = 10: Punkte(8) = 0 Set Polylinie = ThisDrawing.ModelSpace.AddPolyline(Punkte) Dim Punkte1(0 To 2) As Double Dim Punkte2(0 To 2) As Double Punkte1(0) = 0: Punkte1(1) = 12: Punkte1(2) = 0 Punkte2(0) = 20: Punkte2(1) = 12: Punkte2(2) = 0 Set Linie1 = ThisDrawing.ModelSpace.AddLine(Punkte1, Punkte2) Linie1.Update Punkte1(0) = 5: Punkte1(1) = 0: Punkte1(2) = 0 Punkte2(0) = 5: Punkte2(1) = 20: Punkte2(2) = 0 Set Linie2 = ThisDrawing.ModelSpace.AddLine(Punkte1, Punkte2) Linie2.Update intPunkte = Linie1.IntersectWith(Linie2, acExtendNone) intPunkte = Polylinie.IntersectWith(Linie2, acExtendNone)
Erst in der letzten Zeile kommt die Fehlermeldung 445.Hat jemand ähnliche Erfahrung und weiß Abhilfe? Ich bräuchte dringend Hilfe. Mit freundlichen Grüßen der Gemütsmensch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 04. Aug. 2010 18:48 <-- editieren / zitieren -->
Hi, Dein Code, ergänzt durch die fehlenden Deklarationen funkt bei mir.
Code: Dim Polylinie As AcadPolyline Dim Linie1 As AcadLine Dim Linie2 As AcadLine Dim intPunkte As Variant ....
Nur arbeite ich mit AutoCAD und nicht mit Bricscad! - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 04. Aug. 2010 20:38 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred und andere, doch doch, die gleiche Deklaration ist bei mir auch vorhanden. Ich hatte nur den wichtigen Code- Abschnitt gepostet. Wahrscheinlich ist das wirklich ein BricsCAD- bug. Nun habe ich einen anderen Lösungsansatz, den Schnittpunkt zwischen einer Polylinie und einer Linie zu ermitteln. Mit explode zerlege ich die Polylinie in Teilstrecken und durchlaufe diese mit einer Schleife, bis ich den Schnittpunkt gefunden habe. Das klappt mit einer eingefügten Polylinie auch prima. ABER, wenn ich einen eingefügten Block (mein eigentliches Ziel) zerlege, ergibt sich daraus erst die Polylinie und diese wehrt sich standhaft gegen ein weiteres ".explode".
Code: Set Block_eingefuegt1 = ThisDrawing.ModelSpace.InsertBlock(Einsetzpunkt, Block_mit_Pfad, 1#, 1#, 1#, 0) Set Poly_aus_Block = Block_eingefuegt1.Explode
Das gibt Fehlermeldung...Hat jemand eine Idee? Gruß der Gemuetsmensch
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Christian Blei Mitglied
Beiträge: 124 Registriert: 23.06.2008 Thinkpad T60p, 4GB XP,Autocad 2010, ProStructures V8i 2, VBA, VB.NET,
|
erstellt am: 05. Aug. 2010 07:52 <-- editieren / zitieren --> Unities abgeben: Nur für Gemuetsmensch
|
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 05. Aug. 2010 13:49 <-- editieren / zitieren --> Unities abgeben:
Hallo Christian, das ist leider auch nicht die Lösung, ein Array hatte ich vorher schon probiert. Der Code bricht ja bereits in der Zeile Code: intPunkte = Polylinie.IntersectWith(Linie2, acExtendNone)
ab!Ratlos... der Gemütsmensch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 05. Aug. 2010 22:36 <-- editieren / zitieren -->
Hi, >> Set Poly_aus_Block = Block_eingefuegt1.Explode ...auch .Explode liefert ein Array und nicht eine Polylinie zurück (auch wenn die Blockdef nur aus einer Poly bestehen sollte). - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 06. Aug. 2010 11:54 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, Danke für den Hinweis! Ich habe das versucht umzusetzen.
Code: -<snip>- Dim BlockArr() As Variant Dim PartArr() As Variant Dim BlockArrCnt As Integer Dim PartArrCnt As Integer Dim LowBnd As Integer Dim UppBnd As Integer Dim LowBndPart As Integer Dim UppBndPart As Integer Dim BlockArrPart As Variant Dim intPunkte As Variant BlockArr = BlockGezeichnet1.Explode LowBnd = LBound(BlockArr) UppBnd = UBound(BlockArr) For BlockArrCnt = LowBnd To UppBnd Set BlockArrPart = BlockArr(BlockArrtCnt) PartArr = BlockArrPart.Explode LowBndPart = LBound(PartArr) UppBndPart = UBound(PartArr) For PartArrCnt = LowBndPart To UppBndPart Set PartLine = PartArr(BlockArrtCnt) intPunkte = PartLine.IntersectWith(myLine1, acExtendNone) If VarType(intPunkte) <> vbEmpty And UBound(intPunkte) > -1 Then MsgBox "Schnittpunkt:" 'hier käme Ausgabe, wenn Schnittpunkt gefunden Else 'MsgBox "keine Schnittpunkte" End If Next PartArrCnt Next BlockArrCnt -<snip>-
Das läuft auch durch, jedoch wird kein Schnittpunkt vermeldet, obwohl eindeutig eine der Teillinien einen Schnittpunkt mit myLine1 aufweist, den ich mit dem Fangpunkt "Schnittpunkt" als solchen geprüft habe.Könntest Du mir bitte helfen, eventuell den Code einmal in einer anderen BricsCAD- oder AutoCAD- Version laufen lassen? Mit freundlichen Grüßen und für alle Hilfe dankend der Gemütsmensch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 06. Aug. 2010 18:14 <-- editieren / zitieren -->
Hi, >> Könntest Du mir bitte helfen, eventuell den Code einmal in einer anderen BricsCAD- oder AutoCAD- Version laufen lassen? Mit AutoCAD könnt ich es versuchen, hätte ich die Zeichnung mit dem Block. Denn dass Schnittpunkte mit Deinem Code gefunden werden oder nicht, liegt ja dann auch schon an dem Blockeinfügepunkt, ev. auch an dem Z-Wert der Polylinie in der Blockdefinition, an einer räumlichen Verdrehung der Poly oder der Blockreference, .... Nicht immer ist der Code fehlerhaft. - alfred - ------------------ www.hollaus.at |
Gemuetsmensch Mitglied
Beiträge: 18 Registriert: 04.08.2010 BricsCAD 9
|
erstellt am: 08. Aug. 2010 19:01 <-- editieren / zitieren --> Unities abgeben:
Hallo Alfred, es liegt vielleicht an ... dummen Schreibfehlern hattest Du noch vergessen. Wenn man es eilig hat, glaubt man durch weglassen von Option Explicit Zeit zu sparen - mitnichten. Bei BlockArrCnt hatte sich ein t eingeschlichen und beim zweiten Array verwendete ich den falschen Zähler. So findet der Code nun endlich den Schnittpunkt:
Code: -<snip>- Dim BlockArr() As Variant Dim PartArr() As Variant Dim BlockArrCnt As Integer Dim PartArrCnt As Integer Dim LowBnd As Integer Dim UppBnd As Integer Dim LowBndPart As Integer Dim UppBndPart As Integer Dim BlockArrPart As Variant Dim intPunkte As Variant BlockArr = BlockGezeichnet1.Explode LowBnd = LBound(BlockArr) UppBnd = UBound(BlockArr) For BlockArrCnt = LowBnd To UppBnd Set BlockArrPart = BlockArr(BlockArrCnt) PartArr = BlockArrPart.Explode LowBndPart = LBound(PartArr) UppBndPart = UBound(PartArr) For PartArrCnt = LowBndPart To UppBndPart Set PartLine = PartArr(PartArrCnt) intPunkte = PartLine.IntersectWith(myLine1, acExtendNone) If VarType(intPunkte) <> vbEmpty And UBound(intPunkte) > -1 Then MsgBox "Schnittpunkte: x:" & intPunkte(0) & " y: " & intPunkte(1) Else 'MsgBox "keine Schnittpunkte" End If Next PartArrCnt Next BlockArrCnt -<snip>-
Direkt mit der Polylinie arbeiten zu können, wäre mir zwar lieber gewesen, da unkomplizierter. Doch mit dieser Auflösung in Teilstrecken komme ich wenigstens zu einem Ergebnis.An Alfred und alle anderen Helfer ein ganz herzliches Vergelt's Gott! der Gemütsmensch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |