Hot News:

Unser Angebot:

  Foren auf CAD.de (alle Foren)
  AutoCAD VBA
  LWPolylinie Kurve Angleichen über VBA

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
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


Sehen Sie sich das Profil von TomiProg an!   Senden Sie eine Private Message an TomiProg  Schreiben Sie einen Gästebucheintrag für TomiProg

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für TomiProg 10 Unities + Antwort hilfreich

Schlechte Karten. Die Developer Help sagt zur 'alten' Polylinie:

This object is an earlier version of the LightweightPolyline object.
This object exists for backward compatibility only. Use the new LightweightPolyline object to create polylines with an optimized format that saves memory and disk space.


Das bedeutet, daß man sich auch nicht die Mühe gemacht hat, ActiveX-Methoden für Glättung usw. zur Verfügung zu stellen. Die ActiveX-Schnittstelle ist nun mal nicht vollständig!

Es bleibt dir wohl nichts anderes übrig, als Lisp zu verwenden.

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

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 17. Jun. 2004 22:25    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für TomiProg 10 Unities + Antwort hilfreich

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für TomiProg 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von TomiProg an!   Senden Sie eine Private Message an TomiProg  Schreiben Sie einen Gästebucheintrag für TomiProg

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für TomiProg 10 Unities + Antwort hilfreich

Tomi,

das mit den Dialogen stimmt schon. Zum Thema Interaktion VBA-Lisp gibt's genügend Threads, da hab ich mich nie wirklich reingehangen.

Wesentlicher ist für mich die Frage, was das Ganze eigentlich werden soll - gebügelte Polylinien sind ja nun mal sehr eingeschränkt zu gebrauchen. Sie sind so gut wie nicht editierbar - Splines hingegen gibt's doch auch in 14 schon (die sind ja auch die Nachfolger der 'aufgegebenen' geglätteten Polylinien). Schön zu editieren sind die natürlich auch nicht, aber wenigstens geht _TRIM usw.

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

startrek
Moderator
Architekt


Sehen Sie sich das Profil von startrek an!   Senden Sie eine Private Message an startrek  Schreiben Sie einen Gästebucheintrag für startrek

Beiträge: 1361
Registriert: 13.02.2003

.

erstellt am: 18. Jun. 2004 19:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für TomiProg 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von TomiProg an!   Senden Sie eine Private Message an TomiProg  Schreiben Sie einen Gästebucheintrag für TomiProg

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

@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



Sehen Sie sich das Profil von mapcar an!   Senden Sie eine Private Message an mapcar  Schreiben Sie einen Gästebucheintrag für mapcar

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für TomiProg 10 Unities + Antwort hilfreich

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


Sehen Sie sich das Profil von TomiProg an!   Senden Sie eine Private Message an TomiProg  Schreiben Sie einen Gästebucheintrag für TomiProg

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 oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Axel, erstmal Danke für deine Hilfe. Bulge ist mir auch in den Sinn gekommen, hatte aber Probleme beim berechnen des Faktors. Ich weiß jetzt, wie's geht. U's sind unterwegs.

VG
Tomi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2023 CAD.de | Impressum | Datenschutz