| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: 3D Objekt mit gleichmäßig verteilten Löchern (2871 mal gelesen)
|
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 11. Jan. 2015 19:20 <-- editieren / zitieren --> Unities abgeben:
Guten Abend zusammen , ich bin noch recht neu was den Umgang mit VBA betrifft und komme gerade nicht weiter. Mein Ziel ist es ein VBA-Programm zu entwickeln, welches eine rechtwinklige 3D-Konstruktion eines Tunnels erstellt. Dabei sind die Maße frei wählbar. Dieser Teil ist soweit abgeschlossen - damit bin ich zufrieden. Nun geht es mir aber darum, dass man nach Bedarf (Option Buttons) runde/quadratische "Löcher" mit gleichmäßiger Anordnung einfügen kann. Dabei sollen die Anzahl, die Fläche sowie der Abstand vom Boden aus frei wählbar sein (siehe Anhang). Habe zwei Klassen (Tunnel und Löcher) sowie das Formular erstellt und den entsprechenden Code für den Tunnel. Leider komme ich überhaupt nicht weiter; habe eben erst meine bisherigen Versuche wieder auf den Haufen geschmissen, da es zu unübersichtlich wurde und ohne Erfolg verlief. Versuchte es mit einer If-Else-Schleife für die Optionen, habe aber nicht mal eine Öffnung gezeichnet bekommen. Geschweige denn eine Schleife für die gleichmäßige Verteilung (je nach Anzahl) der Löcher... Hat vielleicht wer einen Rat/Denkanstoß? Vielen lieben Dank schon einmal! LG Taker [Diese Nachricht wurde von xTaker am 11. Jan. 2015 editiert.] [Diese Nachricht wurde von xTaker am 11. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 11. Jan. 2015 19:54 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
Hallo xTaker, Willkommen im Forum Arbeitest Du im 2D oder 3D Bereich? Zeichnest Du also Linien(2D) oder Flächen(3D)? Im Prinzip müßtest Du Dir im 2D-Bereich die Mittelpunkte der "Löcher" im 3D-Bereich berechnen und die Zirkel in der entsprechenden Ebene zeichnen lassen. Also ein Benutzerkoordinatensystem definieren und dann über TranslateCoordinates den Mittelpunkt dort bestimmen (Umrechnen vom Welt- ins Benutzerkoordinatensystem). Dann kannst Du den(die) Kreis(e) in dieser Ebene zeichnen. 3D wäre etwas komplizierter. Da müßte die "Stange" von der "Fläche" abgezogen werden, ist aber auch machbar bzw. programmierbar. Hoffe das hilft ein wenig weiter. Grüße Klaus Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 11. Jan. 2015 20:12 <-- editieren / zitieren --> Unities abgeben:
Hallo KlaK, vielen Dank für die Begrüßung und die schnelle Antwort. Ich arbeite im 3D Bereich. Habe von vorherigen Programmierungen einige Hilffunktionen aufgestellt, die ich (hoffentlich?) hier verwenden könnte. In diesem Fall denke ich an drei dieser Funktionen: 1) Zylinder eichnen (für kreisförmige Löcher) 2) Quader zeichnen (für quadratische Löcher) 3) Differenz (Körper zwei, sprich gezeichnete Quader/Zylinder, vom Tunnel "abziehen") Hier mal als Beispiel der Code für den Zylinder:
Code: Public Function ZeichneZylinder(x As Double, y As Double, z As Double, hoehe As Double, Radius As Double) As Acad3DSolid Dim Punkt(0 To 2) As Double Punkt(0) = x Punkt(1) = y Punkt(2) = z + hoehe / 2 Set ZeichneZylinder = ThisDrawing.ModelSpace.AddCylinder(Punkt, Radius, hoehe) End Function
Mein größtes Problem (im Kopf) ist weiterhin die gleichmäßige Verteilung der Löcher je nach gewählter Anzahl. Dabei denke ich zwar ständig, dass es doch durch eine Zählschleife getan sein müsste, komme aber auf nichts, was womöglich einfach an fehlender Erfahrung liegt. Zumal ich die Löcher ja erstmal zeichnen müsste. Einfaches Zeichnen würde mir zwar gelingen, versuche ich es aber mit einer If-Schleife, um die Optionen (keine, runde, quadratische Löcher) zu berücksichtigen, scheiter ich. LG Taker Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 11. Jan. 2015 20:52 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
Warum hast Du denn die Zeichnung (Anhang) wieder gelöscht? Wäre für die vielen Mitleser, die morgen wieder online sind, sicherlich hilfreich. Wenn ich das richtig verstehe geht es Dir um eine möglichst geschickte Programmierung der gleichmäßig verteilten Durchdringungen, was eigentlich recht einfach ist. Zunächst würde ich da erst einmal den Anfangs- und Endpunkt der Wand verwenden und aus der Länge und Anzahl der Löcher die Lage der Mittelpunkte (Abstand vom Anfangspunkt bzw. Abstand untereinander) berechnen. Dann kannst Du über eine For L = 1 to Anzahl - Next Schleife die Löcher berechnen und zeichnen lassen In der Schleife kommt eine Select case Abfrage, die die benötigte Unterfunktion (rund, quadratisch) aufruft. Keine hast Du natürlich schon vorher abgefragt, da gibt es ja nichts zu tun. Hoffe ich hab Deine Anfrage auch richtig verstanden. Grüße Klaus nachdem die Anlage wieder online ist noch eine Frage, die Du aber bestimmt schon gelöst hast: Die Anzahl der Löcher muß ja in die Wand passen. Somit könnte es auch nötig werden mehrere Reihen von Löchern zu generieren. Bei einer gleichmäßigen verteilen kann es dabei zu unterschiedlichen Anzahlen der Löcher pro Reihe kommen, was die Programmierung zwar nicht unmöglich macht aber evtl. eine zweite For - Next Schleife erfordern würde.
[Diese Nachricht wurde von KlaK am 11. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 11. Jan. 2015 21:00 <-- editieren / zitieren --> Unities abgeben:
Habe den Anhang mal wieder angefügt - hatte daran gezweifelt, dass diese hilfreich ist. Vielen Dank ein weiteres mal für deine Antwort. Das klingt schon mal gut soweit - werde mich gleich ransetzen und versuchen, es weitesgehend umzusetzen. Dann melde ich mich nochmals! LG Taker Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 11. Jan. 2015 21:03 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
|
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 12. Jan. 2015 02:30 <-- editieren / zitieren --> Unities abgeben:
So, vor der Nachtruhe schreib ich doch nochmal fix: Habe die Konstruktion mitsamt Löchern mit deiner Hilfe wie gewünscht hinbekommen, insofern nicht der Fall deiner Ergänzung eintrifft. Darüber werde ich mir morgen mal Gedanken machen, da ist es aktuell zu spät für, zumal ich nichtmal einen Ansatz habe. Aber alles zu seiner Zeit. Was ich mich aus (überwiegend optischen) Gründen noch Frage: Ist es möglich, das Acad3dSolid-Objekt zu färben? Sprich im einfachsten Falle das Volumen, ansonsten die Flächen. Fehlt mir ein einfacher Befehl, oder ist es etwas aufwendiger/gar nicht möglich? Ich versuchte es testweise einfach mal mit Objekt.color=[...], allerdings wurden damit nur die Linien gefärbt. LG Taker [Diese Nachricht wurde von xTaker am 12. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
CAD-Huebner Ehrenmitglied V.I.P. h.c. Verm.- Ing., ATC-Trainer
Beiträge: 9732 Registriert: 01.12.2003 AutoCAD 2.5 - 2022, LDD, MDT, RD, ADT, Civil Inventor AIP 4-11, 2008 -2022 Win 10
|
erstellt am: 12. Jan. 2015 08:15 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
|
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 13. Jan. 2015 00:56 <-- editieren / zitieren --> Unities abgeben:
Schade. Aber so ist es auch schon gut, vielen Dank. Noch eine Frage, da mich das objektorientierte Programmieren noch etwas verwirrt: Ich hatte vor, zwei Klassen zu erstellen, jeweils für Tunnel (cTunnel) und Löcher (cLoch). Allerdings komme ich nicht drauf, wie ich das dann entsprechend programmiere. Ich hab das Ganze nun über cTunnel laufen - Variablen für Maße deklariert, Zeichenfunktion aufgestellt - und über das Formular bzw. den dortigen Zeichnen-Button - Zuweisung der Text Boxen zu Variablen, Abrufen der Zeichenfunktion und am Anfang erstmal: Code: Public Tunnel As cTunnelPublic Sub Starten() Set Tunnel = New cTunnel Me.show End Sub
Wobei ich Set Tunnel = New cTunnel nur aus einem Bsp. übernommen habe, 100%ig die Bedeutung hab ich nicht begriffen. Ist es dafür da, um erstmal ein entsprechendes Objekt dieser Klasse zu erzeugen? Jedenfalls, zurück zur eigentlichen Frage: Unter cTunnel habe ich nun auch die Variablen der Löcher deklariert (Radius etc.), was ich eigentlich gerne aus cLoch abrufen würde (da ich das nicht hinbekomme, habe ich, damit die Zeichnung funktioniert, das Ganze erstmal so gehandhabt. D.h. in cTunnel steht die Funktion, die sowohl Tunnel als auch Löcher zeichnet und das Ganze zu einem Objekt verbindet. Ich würde aber gerne cLoch als eigene Klasse haben und abrufen, nicht Auswahl der Öffnungsform und Deklaration der Variablen für die Maße der Löcher in cTunnel stehen haben. Kann mir da noch jemand weiterhelfen, damit ich das noch begreife? Vielen Dank schon einmal und entschuldigt meine sicher völlig abstrakte "Programmiersprache" . LG Taker /edit: Mit Klassen meine ich natürlich "Klassenmodule". [Diese Nachricht wurde von xTaker am 13. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 13. Jan. 2015 13:29 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
Zitat: Ich hatte vor, zwei Klassen zu erstellen, jeweils für Tunnel (cTunnel) und Löcher (cLoch). Allerdings komme ich nicht drauf, wie ich das dann entsprechend programmiere. ... Unter cTunnel habe ich nun auch die Variablen der Löcher deklariert (Radius etc.), was ich eigentlich gerne aus cLoch abrufen würde (da ich das nicht hinbekomme, habe ich, damit die Zeichnung funktioniert, das Ganze erstmal so gehandhabt.)
Du hast Dich aber vorher schon einmal mit den Konzepten der Klassen und Vererbungen beschäftigt? (Let-, Get- Aufrufe für Variable, Class-Funktionen) Oder meintest Du Type-definitionen die Du dann an andere Variablennamen übergeben kannst? Etwa so:
Code: Type CTunnel Höhe As Double Breite As Double Länge As Double Platte As Double Wand As Double End TypeDim Tunnel As CTunnel With Tunnel .Breite = 5# .Höhe = 2.3 End With
[Diese Nachricht wurde von KlaK am 13. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 14. Jan. 2015 01:47 <-- editieren / zitieren --> Unities abgeben:
Solche Type-Definitionen hab ich bereits verwendet, da die Variablen ja den Text-Boxen (also den Eingaben des Benutzers) zugeordnet werden müssen. Ja, ich habe mich dazu belesen, es aber bisher noch nicht praktisch umgesetzt - das ist hier mein erster Versuch dahingehend. Habe jetzt einiges damit ausprobiert, komme aber nicht an's Ziel. Ich umschreib das Ganze nochmal, vielleicht habt ihr noch gewisse Stichpunkte, zu denen ich mich noch belesen kann. Ansonsten, falls Let- und Get-Aufrufe zum Ziel führen können, muss ich mich da noch weiter reinfuchsen. Also ich habe: Im Klassenmodul cTunnel: - Deklariert: Maße von Tunnel und Löcher sowie Locharten - Zeichnung des Tunnels ohne Löcher - Abfrage ob/welche Löcher - Zeichnung der späteren Löcher in Form von Quadern/Zylindern, hierzu werden z.T. Maße des Tunnels benötigt - Zusammenführung: Quader/Zylinder werden vom Tunnel "abgezogen" Im Formular wird die Klasse dann initialisiert und die Eingabefelder werden den Variablen zugeordet, die Zeichen-Funktion aus cTunnel wird abgerufen. Ich hätte gern: Im Klassenmodul cTunnel: - Deklaration: Maße des Tunnels ohne Löcher - Zeichnung des Tunnels ohne Löcher Im Klassenmodul cLoch: - Deklaration: Maße der Löcher (Quader/Zylinder) sowie Locharten - Abfrage ob/welche Löcher - Zeichnung der Löcher (Quader/Zylinder) Im Formular: ... Spätestens nun kommen die Fragezeichen. Eigentlich schon zuvor, denn in der Funktion von cTunnel werden Eigenschaften (Maße) aus cLoch benötigt und andersrum. Würde ich das hinbekommen, hätte ich womöglich im Formular eine Funktion erstellt, die beide Objekte zusammenführt; allerdings starte ich aktuell mit: Dim Tunnel As cTunnel Set Tunnel = New cTunnel und übergebe dann die Variablennamen bzw. rufe die Funktion ab. Würde das mit zwei Objektvariablen bzw. zwei verschiedenen Klassen so auch funktionieren? Oh man, bin ich ein hoffnungsloser Fall? LG Taker 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: 4171 Registriert: 17.05.2001 ACAD20XX, defun-tools
|
erstellt am: 14. Jan. 2015 08:08 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
Zitat: Original erstellt von xTaker: ... Ja, ich habe mich dazu belesen, es aber bisher noch nicht praktisch umgesetzt - das ist hier mein erster Versuch dahingehend.... vielleicht habt ihr noch gewisse Stichpunkte, zu denen ich mich noch belesen kann.
Hallo xTaker,
eine Anmerkung habe ich: Wenn du so sehr am Anfang beim Lernen des Programmieren stehst, dann vergiss das VBA-Zeugs. VB/VBA wird seitens Microsoft nicht weiter entwickelt, wer weiß, wie lange das im AutoCAD überhaupt noch integriert sein wird. In den neueren Versionen muss man die VBA-Unterstützung bereits gezielt nachinstallieren. Fange am besten gleich mit .Net (mir liegt c#.Net am besten) an. Dazu findest du Unmengen an Beispielen im Internet, auch zu deiner Aufgabe (zumindest im Prinzip, wie Klassen angelegt und verwendet werden). Deine bisher angestellten Vorüberlegungen sind ohnehin das Wichtigste, was man bei der Programmierung erledigen muss - die waren also nicht umsonst. Natürlich empfehle ich für das Erlernen der Programmierung eine Schulung (am besten natürlich bei mir ) Damit hast du einen Einstieg, da das autodidaktische Aneignen der Basics mühsam und zeitintensiv sein wird. Grüße! Holger
------------------ 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 |
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 14. Jan. 2015 11:36 <-- editieren / zitieren --> Unities abgeben:
Hallo und vielen Dank für die Antwort. Das angesprochene verstehe ich und habe ich so bzgl. VBA schon des Öfteren gehört oder gelesen. Umso fragwürdiger finde ich, dass ich im Laufe meines Ingenieur Studiums VBA für AutoCAD erlernen muss (bzw. es ist ein Wahlfach, die andere Wahl geht aber mehr in den wirtschaftlichen Bereich. Aus diesem Grund versuche ich mich aktuell schon etwas darauf vorzubereiten (das Fach startet für mich erst im Oktober), habe aber nur Übungsaufgaben älterer Semester gefunden, ohne Lösung oder Skript. Hätte ich die Wahl, würde ich dem Rat sehr sicher folgen, so bleibt mein Problem leider noch bestehen. LG Taker Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 14. Jan. 2015 14:02 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
|
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 14. Jan. 2015 15:17 <-- editieren / zitieren --> Unities abgeben:
Zwei Klassenmodule cTunnel und cLoch. Ich habs nur hinbekommen mit einem Klassenmodul und der Initialisierung dieser Klasse im Formular. /edit: Also es funktioniert, wenn ich im Formular zwei Objektvariablen erstelle, beide Klassen dort initialisiere und dann erst, dort, die komplette Zeichnung vornehme. Die Zeichnung soll aber schon zuvor, innerhalb des Klassenmoduls cTunnel, stattfinden. Also dachte ich mir, ich initialisiere cLoch innerhalb des Konstrukts von cTunnel. Funktioniert soweit auch, ich kann die Variablen der Löcher verwenden, allerdings komm ich dann beim Formular nicht weiter. Eigentlich dachte ich, wenn ich dort dann cTunnel abrufe, wird dadurch auch cLoch abgerufen, da ich es ja in cTunnel verwende. Scheint aber nicht so zu sein. Und anders weiß ich so auch nicht weiter. Vielleicht hat die Erklärung mein Problem nochmal näher durchleuchtet. LG Taker [Diese Nachricht wurde von xTaker am 14. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KlaK Ehrenmitglied V.I.P. h.c. Dipl. Ing. Vermessung, CAD- und Netz-Admin
Beiträge: 2624 Registriert: 02.05.2006 AutoCAD LandDesktop R2 bis 2004 Civil 3D 2005 - 2022 Plateia, Canalis Visual Basic
|
erstellt am: 14. Jan. 2015 17:30 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
Vermutlich hast Du nur noch einen kleinen Denkfehler, aber ohne Sourcecode ist das immer etwas schwierig nach zu vollziehen. Im Prinzip hast Du ja Dein Formular mit der Abfrage der Eingabedaten Wenn Du auf Erstellen gehst übergibst Du diese Eingabewerte an den neuen Tunnel. Innerhalb der Tunnelklasse müßte nun eine Funktion sein die, abhängig von der Art und Lochangaben, neue Lochobjekte erzeugt und diese zeichnen lässt. Vermutlich verwendest Du nur eine Instanz bei den Löchern und nicht mehrere und gibst die Lochwerte (Radius oder Breite/Höhe und Wandstärke) von der Tunnelklasse nicht an die Lochklasse weiter. Sind jetzt nur theoretische Überlegungen, habe solche verschachtelte Klassen noch nicht programmiert. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
xTaker Mitglied
Beiträge: 9 Registriert: 11.01.2015
|
erstellt am: 15. Jan. 2015 12:52 <-- editieren / zitieren --> Unities abgeben:
Okay, nun habe ich es soweit doch noch hinbekommen, wie es geplant war. Eine kleine Sache stört nun noch: Wenn ich das Formular-Fenster geöffnet habe, tritt der Laufzeitfehler 91 auf: "Objektvariable oder with-Blockvariable nicht festgelegt". Starte ich das Programm aus irgendeinem anderen Modul heraus, läuft es exzellent und erfüllt seine Aufgabe. Hat da noch wer einen Rat? LG Taker
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Stelli1 Moderator Verm.-Ing.
Beiträge: 1521 Registriert: 17.08.2005 Map 2000-2014, Rasterdesign, MapGuide, Autodesk Topobase, VS6, VS.net 2013
|
erstellt am: 21. Jan. 2015 18:27 <-- editieren / zitieren --> Unities abgeben: Nur für xTaker
Hallo, Zitat: Original erstellt von xTaker: [i]Wenn ich das Formular-Fenster geöffnet habe, tritt der Laufzeitfehler 91 auf: "Objektvariable oder with-Blockvariable nicht festgelegt". Starte ich das Programm aus irgendeinem anderen Modul heraus, läuft es exzellent und erfüllt seine Aufgabe.
Normalerweise sollte dein Programm doch immer einheitlich gestartet werden. Ich denke du öffnest dein Formular aus der VBAIDE mit F5. Da wird vermutlich ein Objekt/Klasse nicht gesetzt sein die sonst in der Startroutine verarbeitet wird. Eine genaue Ferndiagnose ohne Programmcode ist wohl eher schwierig. Wilfried Stelberg ------------------ Warum lisp'eln wenn's auch anders geht. www.ib-stelberg.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|