| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: LWPolylinie Kurve Angleichen über VBA (3212 mal gelesen)
|
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 16. Jun. 2004 16:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Forum Ich möchte eine LWPolylinie über ein VBA-Prgramm unter ACAD 14 erstellen und anschließend diese Polylinie wie mit PEdit bearbeiten, sprich Dinge tun wie Kurve Angleichen oder Tangenten der einzelnen Punkte ausrichten usw. VBA gibt mir keine Methoden zur Verfügung, mit deren Hilfe ich eine LWPolylinie im vollen Umfang bearbeiten kann. Hat jemand von euch eine Idee, wie sich trotzdem eine LWPolylinie über VBA ändern läßt (speziell Kurve Angleichen und Tangente ausrichten)? Grüße Tomi Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 17. Jun. 2004 20:39 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 17. Jun. 2004 22:25 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Hi Axel, erstmal Danke für die Info, da kann man sich ja sonst totsuchen ;-) Mal 'ne kleine Frage: Ich hab mit Lisp absolute Verständnisprobleme, deswegen eine Bitte, kannst Du mir bitte mal dieses VBAische in Lisp übersetzen ?? In der Hoffnung, dass mich das vielleicht der Sprache etwas näher bringt, wenn ich mal einen visuellen VBA-Lisp Vergleich habe, hoff' Du weisst wie ichs mein ;-) Es geht drum eine LWPolyline in was 3-dim zu verzaubern, eine VBA versus Lisp Code-Gegenüberstellung würde mich hier mal intressieren. Hoffe die Frage ist nicht zu 'Bluna' gestellt, wenn doch dann ... ... na ich werd's an der Anzahl der Replys merken ;-) Gruss Nancy --
Code:
'yellow Sub marine() Dim intC1 As Integer, intC2 As Integer, intcount As Double Dim obj As Object, pt As Variant, vararray1, vararray2() As Double ThisDrawing.Utility.GetEntity obj, pt, "Polylinie wählen: " If Not TypeOf obj Is AcadLWPolyline Then Exit Sub vararray1 = obj.Coordinates ReDim vararray2(UBound(vararray1) + UBound(vararray1) \ 2 + 1) For intC1 = 0 To UBound(vararray2) If (intC1 + 1) Mod 3 = 0 Then vararray2(intC1) = intcount intcount = intcount + 50 Else vararray2(intC1) = vararray1(intC2) intC2 = intC2 + 1 End If Next ThisDrawing.ModelSpace.Add3DPoly vararray2 End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 18. Jun. 2004 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Hi Nancy, eine Übersetzung ist das natürlich nicht. Es ist eine Lisp-Funktion, die genau das selbe macht wie deine VBA-Funktion:
Code:
(defun c:yellowsubmarine( / lwpl z) (setq z -50) (if(=(cdr(assoc 0(setq lwpl(entget(car(entsel "Polylinie wählen: "))))))"LWPOLYLINE") (progn (command"_3dpoly") (foreach gc lwpl (if(=(car gc)10) (command(list(cadr gc)(caddr gc)(setq z(+ z 50)))) ) ) (command) ) ) )
Der Ablauf ist aber ein völlig anderer, und auch die Variablen haben hier allesamt einen ganz anderen Inhalt - bis auf die, die bei dir intcount und bei mir z heisst. Ich fand den Namen nicht sehr deskriptiv - gezählt wird da doch gar nix. Der ganz wesentliche Unterschied zwischen VBA und Lisp ist aber folgender: Dein Weg in VBA ist der einzige mögliche Weg, man kann bestenfalls im Code ein Wenig optisch variieren. Mein Lisp-Vorschlag ist aber nur eine Möglichkeit von vielen. Man kann die 3D-Polylinie wie ich mit COMMAND erzeugen (das geht als Notkrücke in VBA auch mit SENDCOMMAND) - in Lisp ist das sehr effektiv in diesem Fall. Man könnte auch ENTMAKE verwenden, das ist angesagt, wenn gutes Laufzeitverhalten gefragt ist, d.h. wenn mit einer Mehrfachauswahl gleich Tausende von Polylinien bearbeitet werden sollen. Solange aber der User (bei Einzelwahl) sowieso 3 sec. braucht, um ein Element anzupicken, macht es überhaupt keinen Sinn, sich wegen einer tausendstel Sekunde den Kopf zu zerbrechen. Und schließlich bleibt noch ActiveX - dann würde die Lisp-Funktion der VB-Funktion sehr ähnlich, da man dann auch in Lisp mit den VBA-Datentypen hantiert (Arrays). Und dann müsste man auch in Lisp diese Modulo-Abfrage usw. einbauen. Bei den meisten Lisp-Anwendern hier wird die Portierung wahrscheinlich völlig anders aussehen - sie werden mehr als zwei Variablen verwenden, erstmal die Punkte berechnen und erst dann die 3d-Polylinie erzeugen. Ist aber alles nur unnötiger Stromverbrauch, und wir wollen doch alle brav Energie sparen, oder? Mit anderen Worten: Mein Vorschlag ist zwar energiesparend, für dich als Einsteigerin in Lisp wahrscheinlich erstmal schwer verdaulich. Eine 'anfängerfreundliche' SETQ-Orgie gibt's von mir nicht - das ist den Leuten fast nie mehr abzugewöhnen:-( Ach so: Es sind 3 Variablen - gc ist ja auch eine. gc hat aber einen lokalen Namensraum innerhalb foreach (wie bei lambda) und muss/darf deswegen nicht lokal deklariert werden. Gruß, Axel
------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 18. Jun. 2004 12:18 <-- editieren / zitieren --> Unities abgeben:
Hallo Axel. Ich sehe schon, daß ich mit ACAD14 so an die Grenze komme, was die ARX-Reife betrifft. Danke für den Tip es mit Lisp zu versuchen. Hat nur einen Nachteil. Unter Lisp lassen sich nicht so schöne Dialogfelder erzeugen und verwalten wie unter VBA. Vielleicht bekomme ich es ja zusammen mit VBA und LISP hin. Es gibt da aber noch eine ACADUNSUPP.ARX. Kennt die jemand? Damit kann ich doch Befehle aufrufen wie mit COMMAND von LISP. Vielleicht kann mir jemand Tips zum Befehl 'PrintToCmLine' geben. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 18. Jun. 2004 12:39 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
|
startrek Moderator Architekt
Beiträge: 1361 Registriert: 13.02.2003 .
|
erstellt am: 18. Jun. 2004 19:19 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Hi Axel, okay, ich Danke Dir erstmal wie verrückt für die nette Erklärung und die weiterführenden Info's dazu und überhaupt ... Der 'CodeVergleich' der wenn nu auch denne eigentlich keiner ist, schaut ja hübsch kurz aus, aber nunja, wie Du schon richtig vermutet, nicht ganz so einfach für den Anfang. [Will ja jetzt nich sagen, wenn ich dieses mal kann, hör ich mit dem Rauchen auf ;-)] Jedenfalls nochmal thx und ein wunderschönes w/e Gruss, Nancy -- A day without sunshine is like, well, night. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 21. Jun. 2004 11:25 <-- editieren / zitieren --> Unities abgeben:
@Axel Ich habe mir ein Programm erstellt, das mir mit Hilfe einer Polylinie Fußbodenheizschlangen zeichnet. Der Übergang von einer Bahn zur nächsten wird mit einem Biegeradius hergestellt. Wenn der zweifache Biegeradius kleiner als der Verlegeabstand ist, ist das Zeichnen des Übergans kein Problem. Wenn er größer ist, soll der Übergang nicht so kantig aussehen, als ob ich zwei paralelle Linie zeichne und die Enden mit einem Kreisausschnitt verbinde, dessen Durchmesser größer ist als der Verlegeabstand. Wenn ich jetzt in einer Polylinie (ohne Bogenelemente) die Tangenten, die an den Endpunkten der Paralelllinie liegen, richtig ausrichte, dann brauche ich nur noch die Kurven angleichen lassen und schon habe ich ein schönes Heizregister. Und genau das soll VBA machen. Tangenten ausrichten und Kurve angleichen. Es gibt mit Sicherheit auch eine andere Lösung, die auf mathematische Formeln basiert und irgendwelche Bögen erstellt. Es kommen aber dabei immer mehr Parameter hinzu, die ich vorgeben müßte. Es sind GrundParameter vorhanden wie Verlegeabstand, Biegeradius, maximale Fläche pro Register, Wandabstand, Raumabmessungen. Und aus diesen Daten errechne ich dann die einzelnen Plylininen-Punkte, um das Register darzustellen. Ich bin noch in der Entwicklungsphase und die Darstellung der Verbindungsbögen bereitet mir noch sorgen. Eine Kombination aus VBA und Lisp's Command-Befehl ist eine gute Idee. Aber wie bekomme ich von VBA für ACAD14 aus einen LISP-Befehl ausgeführt? Vielleicht mit ACADUNSUPP.EvalLispExpr? [Diese Nachricht wurde von TomiProg am 21. Jun. 2004 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
mapcar Mitglied CADmin
Beiträge: 1250 Registriert: 20.05.2002 Die Phönizier haben das Geld erfunden - aber warum so wenig? (Johann Nepomuk Nestroy)
|
erstellt am: 21. Jun. 2004 14:04 <-- editieren / zitieren --> Unities abgeben: Nur für TomiProg
Hi Tomi, bin weiss Gott kein Fachmann für Fußbodenheizungen - d.h. Worte wie Heizregister sagen mir gar nichts;-) Ich weiss jetzt nicht so richtig, ob ich dich wirklich verstanden habe: Wie kann man da eine Verbindung hinkriegen, wenn der doppelte Biegeradius kleiner ist als der Abstand? Wird da noch ein gerades Stück zwischen zwei 90°-Bögen eingesetzt? Aber egal, du sagst ja, dass das Problem die größeren Radien sind. Da wäre zunächst mal die Möglichkeit, einfach den Gruppencode 42 des LWPolyline-Segments zu modifizieren - in VBA ist das die Methode LightWeightPolyline.SetBulge. Das läuft auf genau das selbe hinaus, wie wenn du die Tangenten der Anschlusspunkte modifizieren würdest. Der sog. 'Bulge' (= Krümmung) ist 1/4 des Tangens des Winkels des vom Bogen definierten Kreissektors - klingt etwas merkwürdig, aber ich hatte schon öfters das Gefühl, dass derjenige, der diesen Bulge bei AutoDesk mal 'erfunden' hat, sich was dabei gedacht hat. Durch diese Definition ist der Bulge bei einem Halbkreis nämlich genau 1. Wird der Radius kleiner, wird auch der Bulge kleiner - bei einem Radius, der doppelt so groß ist wie der Abstand, ist er dann ca. 0.267 Und damit kommen wir zum eigentlichen Trick: Ich nehme jetzt mal ganz theoretische Zahlen - deine Rohre liegen im Abstand von 100mm, die Bögen sind noch nicht dran. Du bräuchtest am Ende 50mm + 1/2 Rohrdurchmesser, um mit perfekten Halbkreisen zu verbinden. Tatsächlich hast du aber nur 37mm + den halben Durchmesser. Dann brauchst du nur den Bulge auf 0.37 ändern, und schon passt's. Jegliche aufwändige Rechnerei kannst du dir in diesem Falle also sparen (ich hab's schon gesehen, dass sich Leute mit dem Bulge einen Wolf gerechnet haben). Vielleicht bringt dich das jetzt weiter - wenn nicht, gibt's sicher noch andere Ideen. Gruß, Axel ------------------ Meine AutoLisp-Seiten Meine private Homepage Mein Angriff auf dein Zwerchfell Mein Lexikon der Fotografie Mein gereimtes Gesülze Meine Überzeugung... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
TomiProg Mitglied Technischer Zeichner
Beiträge: 51 Registriert: 29.04.2004 WinNT4.0(SP6) + AutoCAD 14.01, P3/400MHz(gääähn),256MB,Graphtec KD4620, ATI 3D Rage Pro(8MB)
|
erstellt am: 21. Jun. 2004 14:29 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|