| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| Request a special discount on NVIDIA RTX 5000 Ada Generation GPU !, eine Pressemitteilung
|
Autor
|
Thema: Acad3DSolid's (1641 mal gelesen)
|
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 23. Dez. 2013 18:43 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, bin Anfänger in VBA und möchte mehrere Acad3DSolid's erstellen lassen, die aber alle ein anderes "center" haben. Nachdem mehrere Versuche fehlgeschlagen sind, frage ich jetzt im Forum ob das überhaupt möglich ist. Für Tipps wäre ich sehr dankbar. Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1526 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 27. Dez. 2013 19:00 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
|
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 28. Dez. 2013 16:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Wilfried, mit ein bisschen Überlegung und einem weiteren Versuch hatte ich es noch hinbekommen "der Groschen ist gefallen", jedenfalls in diesem Punkt. Mir scheint allerdings, das LISP für AutoCAD mehr geeignet ist als VBA. Schon das man für Volumenkörper nur die 3DSolid's verwenden kann, gefällt mir nicht. Gruß Dieter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 28. Dez. 2013 16:57 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: Schon das man für Volumenkörper nur die 3DSolid's verwenden kann, gefällt mir nicht.
Was hätte dies mit LISP oder VBA zu tun? 3D-Solids (und nur diese) sind Volumenkörper, egal ob mit VBA, mit LISP oder per Hand/Maus konstruiert. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 30. Dez. 2013 10:24 <-- editieren / zitieren --> Unities abgeben:
Hallo Ingenieur Studio HOLLAUS, LISP bietet (aus meiner Anfänger-Sicht) u. a. die Vorteile: man kann z. B. mit Quader konstruieren, und den kann man einfach über 2 Punkte setzen. In VBA kann man einen "Quader" nur über 3DSolid setzen, dazu muss man dann auch noch 4 Werte deklarieren/bestimmen und die Position der Zentrums berechnen, wenn der Quader in eine Konstruktion passen soll. Gruß Dieter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 30. Dez. 2013 11:06 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
und wenn es so wäre, das die eine Sprache in einem Bereich einige Methoden bereitstellt, welche bei der anderen fehlt, so wird es an anderer Stelle umgekehrt aber genau so sein ! Zudem gibt es in der Anwendung 2 Dinge die auch jeder L.I.S.Pler aus dem VBA gerne hätte, die Dialogprogrammierung sowie die Gültigkeit der Funktionen über den aktuellen (Datei-)Namensraum hinweg. zurück zum aktuellen Thema: Ich vermute du programmierst mit VisualLisp und hast die vla-addbox fFunktion gefunden, <allerdings passen deine Aussagen nicht 100%ig dazu, daher solltest du auch mal sagen WAS und WIE du es nutzt. Die einzige Funktion die deine Aussage erfüllen kann ist der AutoCAD-Befehl _Box/Quader und der steht ja jedem/jeder zur Verfügung> diese sollte es jedoch auch in VBA geben, hier ein Adesk Beispiel:
Code: Sub Example_AddBox() ' This example creates a box in model space. Dim boxObj As Acad3DSolid Dim length As Double, width As Double, height As Double Dim center(0 To 2) As Double ' Define the box center(0) = 5#: center(1) = 5#: center(2) = 0 length = 5#: width = 7: height = 10# ' Create the box (3DSolid) object in model space Set boxObj = ThisDrawing.ModelSpace.AddBox(center, length, width, height) ' Change the viewing direction of the viewport to better see the box Dim NewDirection(0 To 2) As Double NewDirection(0) = -1: NewDirection(1) = -1: NewDirection(2) = 1 ThisDrawing.ActiveViewport.direction = NewDirection ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport ZoomAll End Sub
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD [Diese Nachricht wurde von cadffm am 30. Dez. 2013 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 30. Dez. 2013 14:10 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, natürlich ist mir auch schon aufgefallen, das es in VBA Dinge gibt, die man gern auch in LISP hätte. Ich stelle mal meinen bisherigen VBA-Code ein, in den habe ich auch den letzten Teil deines Beispiels integriert: Sub Korpus() 'KorpusMaße KBreit = 2000 KHoch = 1200 KTief = 333 KMat = 25 'SeiteLinks Dim SeiteLinks As Acad3DSolid Dim SL(0 To 2) As Double SL(0) = KMat / 2 SL(1) = 0 SL(2) = 0 SLlang = KMat SLbreit = KTief SLhoch = KHoch Set SeiteLinks = ThisDrawing.ModelSpace.AddBox(SL, SLlang, SLbreit, SLhoch) 'SeiteRechts Dim SeiteRechts As Acad3DSolid Dim SR(3 To 5) As Double SR(3) = KBreit - KMat / 2 SR(4) = 0 SR(5) = 0 SRlang = KMat SRbreit = KTief SRhoch = KHoch Set SeiteRechts = ThisDrawing.ModelSpace.AddBox(SR, SRlang, SRbreit, SRhoch) 'BodenUnten Dim BodenUnten As Acad3DSolid Dim BU(6 To 8) As Double BU(6) = KBreit / 2 BU(7) = 0 BU(8) = KHoch / -2 + KMat / 2 BUlang = KBreit - KMat - KMat BUbreit = KTief BUhoch = KMat Set BodenUnten = ThisDrawing.ModelSpace.AddBox(BU, BUlang, BUbreit, BUhoch) 'BodenOben Dim BodenOben As Acad3DSolid Dim BO(9 To 11) As Double BO(9) = KBreit / 2 BO(10) = 0 BO(11) = KHoch / 2 - KMat / 2 BOlang = KBreit - KMat - KMat BObreit = KTief BOhoch = KMat Set BodenOben = ThisDrawing.ModelSpace.AddBox(BO, BOlang, BObreit, BOhoch) ' Change the viewing direction of the viewport to better see the box Dim NewDirection(0 To 2) As Double NewDirection(0) = -1: NewDirection(1) = -1: NewDirection(2) = 1 ThisDrawing.ActiveViewport.Direction = NewDirection ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport ZoomAll End Sub Dieser Code erzeugt eine immer gleiche Konstruktion, bei der beliebige Abmessungen vorgegeben werden können. In LISP bin ich damit allerdings schon gefühlte Lichtjahre weiter. Allerdings habe ich in LISP jetzt an einem Punkt ein Problem: es sollen nicht beliebige Maße übernommen werden, sondern z. B. soll es 3 mögliche Höhen geben, (setq AS (getreal "AnzahlSchubkaesten 1 oder 2 oder 3 :")) wenn jetzt eine 4 eingegeben wird, soll das Programm stoppen, auf Falscheingabe hinweisen und LISP-Neustart vorschlagen. Bislang habe ich an dem Punkt nur folgende "Lösung": (if(> AS 3) (command "_close" "_y")) Das ist natürlich nicht die feine englische Art, und bestimmt gibt es da etwas besseres!? Für einen Tipp wäre ich sehr dankbar. Muss ich damit besser das Forum wechseln? Gruß Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 30. Dez. 2013 14:28 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: In LISP bin ich damit allerdings schon gefühlte Lichtjahre weiter.
Was kann LISP bei obigem Beispiel besser? Und eine Überlegung nebenbei: ich würde mir überlegen, Blöcke dafür zu verwenden. Da gibt es Skalierfaktoren (statt der Größen) und du kannst auch gleich Attribute mitgeben, um mehr Auswertbarkeit für Stücklisten mit Größenangaben zu erhalten. Just my 2c. ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 30. Dez. 2013 14:55 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: Original erstellt von dwg3d: an einem Punkt ein Problem: es sollen nicht beliebige Maße übernommen werden, sondern z. B. soll es 3 mögliche Höhen geben, (setq AS (getreal "AnzahlSchubkaesten 1 oder 2 oder 3 :")) wenn jetzt eine 4 eingegeben wird, soll das Programm stoppen, auf Falscheingabe hinweisen und LISP-Neustart vorschlagen.
Da würde ich einen Umweg vorschlagen (Statt einer Zahl würde ich einen String abfragen) und zudem hört es sich so an als wäre ein Abbruch überflüssig - aber ich kenne ja den Code nicht. Schau dir das mal an:
Code: (defun c:TEST ( / CH) (initget "1 2 3") (setq CH (if (setq CH (getkword "\nGrößenvariante eingeben [1/2/3] <2>: ")) (atoi CH) 2)) (alert (strcat "Es wurde Größe " (rtos CH 2 0) " gwählt!")) )
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 31. Dez. 2013 10:55 <-- editieren / zitieren --> Unities abgeben:
Hallo Ingenieur Studio HOLLAUS, obiges Beispiel waren ja nur erste Gehversuche in VBA. In einer LISP-Konstruktion stelle ich zuerst Positionen ein (view, ucs, osmode)[bestimmt ist das in VBA auch möglich]. Für jedes Bauteil wird dann ein Layer erstellt, die Punkte p1 & p2 berechnen (list car cadr caddr), (command "quader" p1 p2) = Bauteil steht in Konstruktion. Ein einfaches Möbel kann (ohne Beschläge) schon mal aus 30 Bauteilen bestehen, das wäre in VBA schon eine Menge Arbeit, in LISP ist es aber noch überschaubar. BLÖCKE Wenn man das mit Blöcken machen wollte, könnte man dann den Skalierfaktor einmal beim einfügen eingeben, und er stände dann automatisch auch im Attribut? Konstruktion mit Blöcken wäre dann aber eine völlig andere Vorgehensweise, oder könnte man das auch in LISP (evtl. VBA) ablaufen lassen, wo man nur noch (je nach Programmierung) BREITE; HÖHE; TIEFE; BEDINGUNGEN vorbestimmen kann? Guten Rutsch Gruß Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013 Windows 8.1 Professional 64 Bit AutoCAD 2020
|
erstellt am: 31. Dez. 2013 10:58 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm, der Code aus (defun c:TEST ( / CH) funktioniert Super. Allerdings frage ich mich, ob man nicht auf (atoi CH) verzichten kann, da durch (initget) ja nur richtige Eingaben akzeptiert werden!? Bislang dachte ich auch, bei Auswahlabfragen (if), müssen zwangsläufig auch (then) und (else) im Code stehen. Im LISP scheint das anders zu sein!? Guten Rutsch Gruß Dieter
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 31. Dez. 2013 12:08 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
(command "quader" p1 p2) = Bauteil steht in Konstruktion.QUADER ist ein AutoCAD-Befehl, keine Lisp-Funktion. In Lisp sprichst du die Befehlszeile mit COMMAND an, in VBA mit SENDCOMMAND ThisDrawing.SendCommand "QUADER" & vbCr & p1 & vbCr & p2 // oder so ähnlich
Ein einfaches Möbel kann (ohne Beschläge) schon mal aus 30 Bauteilen bestehen, das wäre in VBA schon eine Menge Arbeit, in LISP ist es aber noch überschaubar. Es ist in VBA nicht wirklich mehr Arbeit(abgesehen vom Variablen deklarieren), aber das zählt nicht wirklich oder? BLÖCKE Wenn man das mit Blöcken machen wollte, könnte man dann den Skalierfaktor einmal beim einfügen eingeben, und er stände dann automatisch auch im Attribut? Wenn du einen entsprechenden Block hast (Attributwert mit Block-Platzhalter-Schriftfeld), dann ja (wobei du auch "dumm" den gewählten Faktor eintragen könntest "automatisch", Schriftfeld wäre aber cleverer. <BlockPlatzHalterBeispiel>
Konstruktion mit Blöcken wäre dann aber eine völlig andere Vorgehensweise, oder könnte man das auch in LISP (evtl. VBA) ablaufen lassen, wo man nur noch (je nach Programmierung) BREITE; HÖHE; TIEFE; BEDINGUNGEN vorbestimmen kann? Ob man einen Block nehmen kann mußt du wissen (wir kennen die Formen und Bedingungen ja nicht), ansonsten mußt man noch mal generell sagen: Über eine Programmierung steht dir so ziemlich alles zur Verfügung was dir ohne Programmierung auch zur Verfügung steht und darüber hinaus noch viel mehr !
Allerdings frage ich mich, ob man nicht auf (atoi CH) verzichten kann, da durch (initget) ja nur richtige Eingaben akzeptiert werden!? getkword liefert einen String, in deinem Beispiel wolltest du eine Zahl haben - ob du auch mit einem String leben kannst mußt du wissen, wir kennen ja deinen Code nicht.
Bislang dachte ich auch, bei Auswahlabfragen (if), müssen zwangsläufig auch (then) und (else) im Code stehen. Im LISP scheint das anders zu sein!? IF und THEN sind zwingend nötig, Else ist optional: (if...
------------------ CAD on demand GmbH - Beratung und Programmierung rund um AutoCAD Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 02. Jan. 2014 12:05 <-- editieren / zitieren --> Unities abgeben:
Hallo cadffm & alle interessierten, komme an einem Punkt nicht weiter, es soll ein Bauteil in Z-Richtung kopiert werden: (setq LA (- OKF UKF RB RB)) (command "_copy" (entlast) "" "0,0,0" "0,0,LA"); not works AutoCAD kann offensichtlich das LA an der Stelle nicht verarbeiten. Kann man an der Stelle nichts anderes als Zahlen einsetzen? Gruß Dieter PS: Muss evtl. das Forum wechseln, da ich (im Moment noch) die Konstruktion mit LISP bevorzuge
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadffm Ehrenmitglied V.I.P. h.c. 良い精神
Beiträge: 22275 Registriert: 03.06.2002 System: F1 und Google
|
erstellt am: 02. Jan. 2014 12:13 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
|
rexxitall Mitglied Dipl. -Ing. Bau
Beiträge: 270 Registriert: 07.06.2013 Various: systems, Operating systems, cad systems, cad versions, programming languages.
|
erstellt am: 04. Mrz. 2014 18:20 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Mal ne dumme frage warum nicht eine VBA routine schreiben die entweder etwas sweept oder extrudiert ? Minimal mehr Aufwand aber maximal flexibel. Zum Thema lisp - lisp ist eine Insellösung Ausser in ACAD nicht zu gebrauchen. VBA gibt es übergreifend in vielen Anwendungen bis zum Betriebsystem und lässt sich auch wunderbar mit externen dlls verheiraten. mfg Thomas ------------------ Wer es nicht versucht, hat schon verlorn Und bei 3 Typos gibts den vierten gratis ! <<< for sale ! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Ehrenmitglied V.I.P. h.c. CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 06. Mrz. 2014 10:15 <-- editieren / zitieren --> Unities abgeben: Nur für dwg3d
Zitat: Original erstellt von rexxitall: Mal ne dumme frage warum nicht eine VBA routine schreiben die entweder etwas sweept oder extrudiert ? Minimal mehr Aufwand aber maximal flexibel.
Weil die VBA-Unterstützung auf absehbare Zeit nicht mehr gegeben sein wird. Dann wohl doch besser .Net (und da würde ich nicht auf VB sondern auf c#+.Net setzen) Zitat: Original erstellt von rexxitall: ... Zum Thema lisp - lisp ist eine Insellösung Ausser in ACAD nicht zu gebrauchen. VBA gibt es übergreifend in vielen Anwendungen bis zum Betriebsystem und lässt sich auch wunderbar mit externen dlls verheiraten.
Weil Lisp leistungsstärker ist als VBA. Lisp kommt aus dem Bereich der künstlichen Intelligenz und ist keinesfalls nur als Insellösung für AutoCAD anzusehen. (die Vorteile, die Lisp bietet werden jedoch seltenst ausgeschöpft. Imgrunde würden sehr viele Lisp-Tools als einfache Scripte genauso funktionieren) Aber suche mal nach CommonLispUnd meine persönliche Meinung ist: Eine Programmiersprache bestimmt nur die Syntax. Die Logik, die ein Programm braucht, ist davon vollkommen unabhängig. Daher ist es aus meiner Sicht grundsätzlich möglich, seine Aufgaben in verschiedenen Sprachen umzusetzen - je nach dem, welche API die besseren Möglichkeiten für die jeweilie Aufgabe bietet.
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
dwg3d Mitglied Techniker- Holztechnik
Beiträge: 63 Registriert: 05.04.2013
|
erstellt am: 06. Mrz. 2014 20:48 <-- editieren / zitieren --> Unities abgeben:
Hallo Leute, es freut mich zu sehen, das mein Beitrag immer noch auf Interesse stößt Sweepen und/oder extrudieren kann in der Möbelkonstruktion auch schon mal erforderlich sein, aber der Quader ist das Bauteil, welches mit Abstand die meiste Anwendung findet. Wenn man z. B. einen Möbelkorpus (der aus 4 Bauteilen besteht)in einem Stück extrudieren würde, hätte man später in der Stückliste nur ein Bauteil, anstatt 4 Bauteile mit den jeweils richtigen Maßen. In einem LISP-Programm kann man Quader ganz hervorragend erzeugen und positionieren. Mit VBA ist es auch möglich, aber es ist wesentlich mehr Aufwand. Gruß Dieter Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |