| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | SPINNER Hausausstellung |
Autor
|
Thema: API: Part automatisiert erstellen (variabel) (2856 mal gelesen)
|
Rosco Mitglied
Beiträge: 19 Registriert: 29.10.2014 SolidWorks 2013 x64, SP3.0
|
erstellt am: 29. Okt. 2014 16:07 <-- editieren / zitieren --> Unities abgeben:
Hallo SW-Community, Ich versuche mich gerade an der "Konvertierung" eines Catia-makros in SW. Da ich bisher noch keine SW-Makro-Erfahrung habe, hätte ich demnächst ein paar Fragen an euch und würde diese hier in den Thread bündeln. Mir ist bewusst, dass beide Programme anders arbeiten (Stichwort Bodies/Geom. Sets(Punkte,Linien) vs. Skizze/Features only). Daher werden einige work-arounds benötigt. Aufgabe des Makros: Grundlage des Makros ist eine Excel-Datei, in der Punkte eines Trägermodells bestimmt werden und diese als CSV-Datei ausgegeben werden. Die Punkte definieren Start und Endpunkte der Träher des Modells, quasi die Start- und Endpunkte der Systemlinien. Das Makro soll diese Punkte einlesen und damit das Part Schritt für Schritt aufbauen. Jedes Punktepaar ist in der CSV-Datei in einer Zeile gespeichert. Das Trägermodell dient als Konzept und besteht aus rechteckigen Quadern, die immer 2 Träger der nächsten Ebene verbinden, bis am Ende alle Punkte der Ursprungsebene in einen Hauptträger münden. Ablauf des alten Makros (modularisiert): 1. Punkte einlesen und in Arrays speichern. <erledigt> 2.Punkte, Linien, Features erzeugen 3.Passe Eigenschaften an (Farbe, etc.) 4.Speichere Part
Aktuelle Baustelle: 2. Punkte einlesen und in Arrays speichern
geplanter Ablauf: Schleife von 1. Zeile bis letzter Zeile der CSV: Erzeuge Punkt 1&2 Erzeuge Linie1, von P1 bis P2 Erzeuge eine Ebene Senkrecht zur L1 durch P1 Erzeuge Mittelpunkt-Rechteck/Kreis auf E1 mit P1 Linearer Aufsatz von Recheck/Kreis entlang L1 Loop Passe Eigenschaften an Speichere Part bisheriger Code:
Code:
sub Main () Dim GeomOpt As String 'string, da u.a. abgefragt wird: If GeomOpt = "" Then Exit Sub GeomOpt = 10 'wird per Inputbox abgefragt, hier der Einfachheit halber definiert Call CreateProfile(GeomOpt) end sub Sub CreateProfile(Geom As double)
Dim swSketch1 As SldWorks.Sketch Dim skPt1, skPt2 As Object Dim skLinie As Object Dim skLinieArr(1 to 100) As String, skPunktArr(1 To 100, 1 To 2) As String Dim PlaneConst1 As Boolean Dim PlaneConst2 As Boolean Dim i as Double, j as Integer dim DefPt1(150, 2) as variant dim DefPt2(150, 2) as variant 'für Proben; Arrays werden sonst in separaten Modul befüllt, ausgelesen aus CSV-Datei (Beispiel: 1246,75) Kann es Probleme mit der Umwandlung Komma - Punkt geben? Beim Einlesen muss ich bereits zB. DefPt1(1, 0) = 1246,75 / 1000 definieren DefPt1(1, 0) = 1246.75 DefPt1(1, 1) = -2007 DefPt1(1, 2) = 210 DefPt2(1, 0) = 1246.75 DefPt2(1, 1) = -2007 DefPt2(1, 2) = 210 swPart.SketchManager.Insert3DSketch True Set swSketch1 = swPart.GetActiveSketch2 j = 0 For i = 1 To nZeile 'in DefPt1() und DefPt2() werden im separaten Modul die Punkte eingelesen und abgespeichert 'Originalcode Set skPt1 = swPart.SketchManager.CreatePoint(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2)) 'Erstellt Punkt mit Index 2 ("Point2")! Warum? Set skPt2 = swPart.SketchManager.CreatePoint(DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2)) 'Erstellt Punkt mit Index 4 ("Point4")! Warum? Punkt 1 und 3 fehlen als Index in SW.. j = j + 2 'wird benötigt, um die Punkte in SW anzusprechen. Distance(i) = 1000 * ((DefPt2(i, 0) - DefPt1(i, 0)) ^ 2 + (DefPt2(i, 1) - DefPt1(i, 1)) ^ 2 + (DefPt2(i, 2) - DefPt1(i, 2)) ^ 2) ^ 0.5 'Punktabstand 'Wenn Geom = 0, dann nur Punkte - Rest des Makros entfällt; Abstand muss einen reellen Wert haben 'Wenn Geom >= 1, zeichne Linien If Geom > 0 And Distance(i) > 0 Then 'Wenn Geom = 0 dann nur Punkte; Abstand muss einen reellen Wert haben Set skLinie = swPart.SketchManager.CreateLine(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2)) skLinieArr(i) = "Line" & i skPunktArr(i, 1) = "Point" & j 'j ist als Lösung für das Problem der Punktnumerierung in SW gedacht, da skPt1 als 'Point2' und skPt2 als 'Point4' in SW definiert wurde. 'MsgBox skLinieArr(i) ' boolstatus = swPart.EditRebuild3() 'Wenn Geom > 1, erstelle Körper If Geom > 1 Then If DefAbmessung(i, 0) = 0 Or DefAbmessung(i, 0) = 1 Then ' "Erzeuge eine Ebene Senkrecht zur L1 (=Line1) durch P1 (=Point2)" 'Die folgenden Zeilen wurden aus dem Makrorecorder abgeleitet. Die Ebene wird aber nahe des Ursprungserstellt und nicht an den SkPt1 erstellt. Warum? boolstatus = swPart.Extension.SelectByID2(skLinieArr(i), "SKETCHSEGMENT", DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), True, 0, Nothing, 0) boolstatus = swPart.Extension.SelectByID2(skPunktArr(i, 1), "SKETCHPOINT", DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), True, 0, Nothing, 0) boolstatus = swPart.SketchManager.CreateSketchPlane(8, 9, 0) boolstatus = swPart.Extension.SelectByID2("Plane1", "SKETCHSURFACES", 0, 0, 0, False, 0, Nothing, 0) End If End If End If Next End Sub
Kann mir hier wer weiterhelfen? Vielen Dank im Vorraus! [Diese Nachricht wurde von Rosco am 30. Okt. 2014 editiert.]
[Diese Nachricht wurde von Rosco am 30. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rosco Mitglied
Beiträge: 19 Registriert: 29.10.2014 SolidWorks 2013 x64, SP3.0
|
erstellt am: 30. Okt. 2014 08:35 <-- editieren / zitieren --> Unities abgeben:
|
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 30. Okt. 2014 09:38 <-- editieren / zitieren --> Unities abgeben: Nur für Rosco
Hallo Rosco, und herzlich willkommen im SolidWorks-Brett auf CAD.de Vorneweg: ähnlich wie bei der Modellierung/Zeichnen solltest du auch bei der Makroprogrammierung versuchen dich von der Art und Weise zu lösen, wie du von der Programmlogik in CATIA gearbeitet hast. Das ist vielleicht nicht ganz so unterschiedlich wie die interaktive Arbeitsweise, aber manchmal eben doch. Außerdem ist so ein Code-Rewrite immer eine passende Gelegenheit auch über die Struktur und Ablauf nachzudenken Von daher wäre es vielleicht besser, als den vorhandenen Ablauf nachzubauen ( was natürlich verführerisch ist, weil es ja schon funktioniert hat) lieber zu schauen, was ich habe (die CSV-Datei mit lokalisierten Koordinaten) und was zum Schluss rauskommen soll (das hab ich nicht so ganz geblickt, du erzeugst sowohl Punkte als auch Linien und Referenzebenen in einer 3D Skizze, da kommt dann vermutlich noch was). Vielleicht wäre es einfacher das direkt mit anderen Befehlen zu machen, kann ich schlecht beurteilen. Mehrere Fragen zu unterschiedlichen Aufgaben in ein Thema zu packen ist nicht so günstig, das werden schnell Monsterthreads, die keiner mehr durchblickt, der nicht von Anfang an dabei war und für spätere Suchen sind die auch nicht so prickelnd. Also von daher lieber nach jedem Schritt weiter einen neuen Thread anfangen, am Besten mit dem Code, den man bis dahin hat und ggf. auf den alten Thread verlinken. Jetzt noch Antworten, so weit ich die ohne Testen und probieren beantworten kann: Zitat: Original erstellt von Rosco: Kann es Probleme mit der Umwandlung Komma - Punkt geben? Beim Einlesen muss ich bereits zB. DefPt1(1, 0) = 1246,75 / 1000 definieren
Ja, das ist Standard in VBA (hat nichts mit SolidWorks zu tun). Es gibt für solche Typumwandlungen (Text in Zahl) extra Funktionen in VBA, was du vermutlich brauchst ist die CDbl(), die konvertiert Texte in Doubles (Gleitkommazahlen) und benutzt dabei die im Windows eingestellten Dezimalseparatoren. also hierzulande das Komma als Dezimaltrenner. Nur als Hinweis:
Zitat: Original erstellt von Rosco: Distance(i) = 1000 * ((DefPt2 ...
Ich vermute du machst das um auf normale Millimeter zu kommen. Ich würde empfehlen solche "Umwandlungen" nicht zu machen und einfach wie SolidWorks selbst auch alles in Meter und RAD (nicht Grad) zu rechnen. Erst wenn du eine externe Ausgabe machen willst ist dann ggf. eine Umwandlung fällig. Zitat: Original erstellt von Rosco: Die folgenden Zeilen wurden aus dem Makrorecorder abgeleitet. Die Ebene wird aber nahe des Ursprungserstellt und nicht an den SkPt1 erstellt. Warum?
Dem Makrorekorder solltest du nicht so wirklich vertrauen, der ist gut, um einen Anhaltspunkt zu bekommen, nach welchen Befehlen man mal schauen kann, aber so gut wie die z.B. von Excel oder Word ist der lange nicht. Gerade die Selekiererei ist immer so eine Sache, manchmal steht da schlichtweg auch Müll im Makrorekordercode. Was hier jetzt bei dir falsch läuft weiß ich nicht. Die Selektion über einen Namen, den du dir selbst zusammenbastelst, finde ich erst mal etwas merkwürdig. Wird denn das tatsächlich was selektiert, wenn du das schrittweise ablaufen lässt? Ich würde zum Selektieren der Punkte bzw. des Sketchsegments lieber über die enstprechenden Objekte und dann das Select4 gehen, also z.B. mit skPt1.GetId die Id des Sketchpunkts oben holen und sich merken (falls später noch gebraucht) und mit skPt1.Select4 den Skizzenpunkt selektieren. Vielleicht klappt das dann mit dem Erzeugen der Skizzenebene (oder willst du eine Referenzebene erzeugen?). Zitat: Original erstellt von Rosco: swPart.SketchManager.CreateSketchPlane(8, 9, 0)
Den Code hast du vermutlich aus dem Makrorekorder übernommen, ich würde dir empfehlen statt der Zahlen die numerischen Konstanten dafür zu nutzen, also statt 8 swConstraintType_PERPENDICULAR, statt 9 swConstraintType_COINCIDENT und statt 0 swConstraintType_INVALIDCTYPE, ist zwar mehr Gefummel beim Erstellen, lässt sich aber später deutlich leichter lesen, was da eigentlich gemeint ist. Natürlich entweder selbst die Konstanten erstellen oder die swconst Typelib einbinden. Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rosco Mitglied
Beiträge: 19 Registriert: 29.10.2014 SolidWorks 2013 x64, SP3.0
|
erstellt am: 30. Okt. 2014 10:05 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, Danke erst mal für die Antwort. Zu den Punkten: Den Ablauf des alten Makros hatte ich ja am Anfang mal grob dargestellt. Ich habe im Anhang nochmal ein Bild eingefügt von einem Trägermodell, wie es am Ende prinzipiell aussehen soll. Das gezeigte Modell hat 5 Ebenen von unten ('Fußboden' - nicht dargestellt) nach oben (großer Hauptträger) aufgebaut. Komma - Punkt: ok. Das ist denke ich eine Sache, die ich im Nachhinein optimieren kann. Aktuell habe ich ein Work-around, der erstmal funktioniert. Das würde ich also später ändern. Prinzipiell brauche ich aber das Modell an einer bestimmten Position im Raum (im CSV sind Millimeter die Einheit), da es relativ zu weiteren Trägermodellen positioniert wird. In SW werden mir die Positionen der Punkte auch in Millimetern wieder gegeben, wenn ich einen auswähle. Ich nehme an, dass es eine Einstellungssache ist. Aber wie gesagt, werde ich später anpassen. Ebene/Punkte auswählen: Ja, das stammt aus dem Recorder. Da ich die API-Hilfe ziemlich gewöhnungsbedürftig finde und nur schwer damit zurecht komme, ist der Recorder in solchen Fällen mein erster Ansprechpartner. Über "skPt1.GetId" bin ich bisher z.B. noch nicht gestoßen, bei der Suche nach Punkte selektieren u.ä. Das mit "swPart.SketchManager.CreateSketchPlane(8, 9, 0)" und den Konstanten habe ich leider noch nicht verstanden. Ich habe die Konstanten "swConstraintType_PERPENDICULAR" , etc. bereits in der API_hilfe gefunden, aber ich kann mit denen noch nicht viel anfangen. Wie kann ich diese benutzen? Beispiele finden ist in SW sehr schwer. :/ Ich habe gerade den Versuch gestartet, sämtliche Punkte und Linien nach ihrer Erstellung zu fixieren, sodass ich die Ebene im weiteren Schritt nach dessen Erstellung (wo auch immer sie erstellt wird) an den jeweiligen Punkt bzw. Linie zu beziehen. Ich schaue mal, wie ich dem Befehl GetID einbauen kann.
Danke vorerst P.S.: Zu der Selektierung: Ja dies scheint zu funktionieren. Folgende Beispiel stammt aus dem Versuch die Elemente nach der Erstellung direkt zu fixieren, den ich zuvor beschrieben habe
Code:
Set skPt1 = swPart.SketchManager.CreatePoint(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2)) j = j + 1 skPunktArr(i, 1) = "Point" & j 'skPunktArr(i, 1) beinhaltet "Point1" boolstatus = swPart.Extension.SelectByID2(skPunktArr(i, 1), "SKETCHPOINT", DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), False, 0, Nothing, 0) swPart.SketchAddConstraints "sgFIXED"
Der Punkt wird fixiert. Ich gehe aktuell davon aus,dass das erste Argument von SelectByID2 diesen Wert (Point1) beinhalten muss, damit der entsprechende Punkt angesprochen wird. Ich werde ich wohl auch mit der GetID arbeiten können, oder? [Diese Nachricht wurde von Rosco am 30. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rosco Mitglied
Beiträge: 19 Registriert: 29.10.2014 SolidWorks 2013 x64, SP3.0
|
erstellt am: 30. Okt. 2014 11:40 <-- editieren / zitieren --> Unities abgeben:
|
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 30. Okt. 2014 11:44 <-- editieren / zitieren --> Unities abgeben: Nur für Rosco
Hallo Rosco, ja, die API Hilfe ist anfangs etwas gewöhnungsbedürftig, aber wenn du das System erst mal verstanden hast ist das Ding echt gut - und oftmals dein einziger Freund Auch an Beispielen finde ich dort jede Menge und benutze die eigentlich viel öfter als den Makrorekorder, der führt bei mir mehr so ein Mauerblümchendasein. Mit den Konstanten ist eigentlich recht einfach, es geht dabei nur darum sprechende Namen statt komischer Zahlen zu verwenden, um den Code lesbarer zu machen. Du kannst dir deine eigenen Konstanten erfinden, z.B. Const Rosco = 12 Und jedesmal, wenn du die Zahl 12 brauchst, schreibst du statt dessen Rosco, wie in EinDutzend = Rosco Es macht natürlich mehr Sinn das die Namen zu benutzen,d ie SolidWorks dafür vorgesehen hat, damit alle immer von demselben reden. Wenn z.B. beim erstellen der Skizzenebene eine Bedingung "Senkrecht" gebraucht wird ist dafür der richtige Parameter die 8. Aber das kann sich ja keiner merken, also ist es einfacher dort Senkrecht zu schreiben, oder noch besser, weil in der Programmierung fast alles in Englisch läuft Perpendicular. Da es dieses Perpendicular nun an vielen Stellen gibt wäre es clever noch mit dabei zu schreiben, wobei dieses senkrecht gemeint ist, in diesem Fall ja für die Beziehungen, neudeutsch constrains. Und da hat SolidWorks netterweise alle möglichen Konstanten bereits zu Gebrauch definiert, die fangen praktisch immer mit sw an, was dann zu swConstraintType_PERPENDICULAR führt, was letztlich eine 8 liefert. Du kommst an alle diese Konstanten ran, in dem du im Makroeditor (VBA-Entwicklungsumgebung) unter Extras/Verweise die swconst.tlb alias "SolidWorks XXXX Constant Type library" einbindest. Überall da, wo dann so eine Konstante genutzt wird schaut der Compiler dann hinterher nach, was das für einen Wert hat und setzt das ein. Mit dem Selektieren kannst du in der Regel auch anders machen als eine Selektion über Namen, wenn du die Objekte schon hast. Wie oben beschrieben gibt es für deine erzeugten Objekte SketchPoint und SketchSegment jeweils mit der Select4 eine Methode, dass du die ohne Selektionsmanager auswählen kannst - das ist einfacherer und vor allem sicherer. Ich hab auf Basis deines Makro mal was kleines gestrickt, das dir eine 3D-Skizze erzeugt, weui Punkte und ein Skizzensegment erzeugt, diese selektiert und an dem Endpunkt senkrecht auf der Linie eine Skizzenebene erzeugt. Im Deklarationsbereich oben habe ich statt der generischen Objekte direkt die SolidWorks-Objekte benutzt, ich persönlich bin zwar auch Anhänger des Late Binding, in diesem Fall ist es aber erst mal einfacherer und klarer, was was sein soll (siehe dazu auch Diskussionen hier im Brett). Hier kommt der Code:
Code:
Sub Main() Dim swApp As SldWorks.SldWorks Dim swPart As SldWorks.ModelDoc2 Dim swSketch1 As SldWorks.Sketch Dim skPt1 As SldWorks.SketchPoint Dim skPt2 As SldWorks.SketchPoint Dim skLinie As SldWorks.SketchSegment Dim i As Long Dim DefPt1(1, 2) As Double Dim DefPt2(1, 2) As Double ' zwei Punkte zum Testen, Angaben in Meter DefPt1(1, 0) = 0# DefPt1(1, 1) = 0# DefPt1(1, 2) = 0# DefPt2(1, 0) = 0.1 DefPt2(1, 1) = 0.5 DefPt2(1, 2) = 0.3 ' an SolidWorks anhängen, aktives Dokument holen Set swApp = Application.SldWorks Set swPart = swApp.ActiveDoc ' 3D-Skizze einfügen swPart.SketchManager.Insert3DSketch True Set swSketch1 = swPart.GetActiveSketch2 ' zwei Punkte erzeugen; ggf. SetAddToDB einschalten, um Probleme mit Snapping zu vermeiden i = 1 Set skPt1 = swPart.SketchManager.CreatePoint(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2)) Set skPt2 = swPart.SketchManager.CreatePoint(DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2)) ' zusätzlich eine Skizzensegment zwischen den Punkten erzeugten Set skLinie = swPart.SketchManager.CreateLine(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2)) ' erst den Punkt, dann das Skizzensegment selektieren skPt2.Select4 False, Nothing ' neue Selektion skLinie.Select4 True, Nothing ' an die vorhandene Selektion anhängen ' dann eine Skizzenebene mit den vorselektierten Objekten erzeugen. In Auswahl 1 ' steht der Punkt, der soll deckungsgleich sein, in Auswahl 2 das Skizzensegment, ' darauf soll es senkrecht stehen und es gibt keine dritte Auswahl Debug.Print swPart.SketchManager.CreateSketchPlane(swConstraintType_COINCIDENT, swConstraintType_PERPENDICULAR, swConstraintType_INVALIDCTYPE) ' und mal alles durchrechnen, dadurch auch die Skizze schließen Debug.Print swPart.EditRebuild3 End Sub
Einfach in ein neues, leeres Makro einfügen, bei mri läuft das so, dann hast du vielleicht eine Basis, mit der du weiter stricken kannst. Ciao, Stefan
------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rosco Mitglied
Beiträge: 19 Registriert: 29.10.2014 SolidWorks 2013 x64, SP3.0
|
erstellt am: 30. Okt. 2014 15:13 <-- editieren / zitieren --> Unities abgeben:
Super Erklärung. Vielen Dank! Das mit dem Befehl -select append, data- macht auf einmal richtig sinn, auch wie es in der API-Beschreibung steht! xD Man sollte vielleicht doch nicht zu viel zeug lesen, das macht einen nur mehr konfus.. Gleiches mit den Bedingungen der Ebene.. Zu deinem Makro eine Frage: Warum schreibst du in der vorletzten Zeile das Debug.Print? (Debug.Print swPart.SketchManager.CreateSketchPlane(... ) Weiterhin nochmal eine Frage zum Abspeichern der Punkte: Wenn ich jetzt später noch einmal auf skPt1 aus diesem Loop zugreifen möchte, bringe ich ihn am besten in einem Feld unter. Code:
dim j as integer j = 0 Set skPt1 = swPart.SketchManager.CreatePoint(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2)) j = j + 1 skPtID(j) = skPt1.GetID
jetzt habe ich die ID abgelegt. Wie kann ich aber später wieder darauf zugreifen mit select4, wenn ich in einem weiteren loop skPt1 und 2 bereits neu definiert wurden? Oder muss ich dann auf SelectByID2 zurückgreifen? Der Loop kommt auf Grund des zeilenweisen Auslesens der CSV-Datei. Rosco p.s.: Um diese Frage noch zu erweitern: wenn ich ausschließlich eine Linie erzeuge, über die Koordinaten wie im Code oben, werden doch automatisch auch Punkte erzeugt. Kann ich diese ebenfalls auslesen und abspeichern? [Diese Nachricht wurde von Rosco am 30. Okt. 2014 editiert.]
[Diese Nachricht wurde von Rosco am 30. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 30. Okt. 2014 15:57 <-- editieren / zitieren --> Unities abgeben: Nur für Rosco
Hallo Rosco, Zitat: Original erstellt von Rosco: Warum schreibst du in der vorletzten Zeile das Debug.Print? (Debug.Print swPart.SketchManager.CreateSketchPlane(... )
Aus sentimentalen Gründen. Im Ernst, hat keinen Nährwert, die Funktion liefert halt einen Wert zurück, ich wollte mir den nicht in einer Variablen boolstatus merken, deswegen schreib ich das in der Regel dann in die Debugkonsole um im Zweifelsfall sehen zu können, was zurückgeliefert wurde. Zitat: Original erstellt von Rosco: Wenn ich jetzt später noch einmal auf skPt1 aus diesem Loop zugreifen möchte, bringe ich ihn am besten in einem Feld unter.
Ja, aber da brauchst du ja nicht über die Id gehen (die auch wohl was anderes ist als wir beide uns darunter vorstellen würden ;) ). Merk dir einfach das Objekt des Punktes. Ich würde so etwas auch nicht in einem Feld machen, sondern in einer Collection - ich hab aber auch erst spät Geschmack an Collections gefunden :D Also ohne es getestet zu haben mit Feldvariablen etwa so: Code: Dim mySktPt(10) As SldWorks.SketchPoint [...] Set skPt1 = swPart.SketchManager.CreatePoint(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2)) Set skPt2 = swPart.SketchManager.CreatePoint(DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2)) Set mySktPt(1) = skPt1 Set mySktPt(2) = skPt2 [... viel sinnvoller Code ...] mySktPt(1).Select4 False, Nothing mySktPt(2).Select4 True, Nothing
Zitat: Original erstellt von Rosco: p.s.: Um diese Frage noch zu erweitern: wenn ich ausschließlich eine Linie erzeuge, über die Koordinaten wie im Code oben, werden doch automatisch auch Punkte erzeugt. Kann ich diese ebenfalls auslesen und abspeichern?
Ja, das geht mit Sicherheit auch, das wäre doch eine schöne Aufgabe zum tüfteln für dich. Alelrdings musst du beim Programmieren oft in sehr kleinen Schrittchen denken und dich entsprechend durchhangeln. In diesem Fall kommst du vom SketchSegment auf die darunterliegende Curve, dann via GetEndParams an die Koordinaten der Start- und Endpunkte. Schau dir in der API Hilfe das Beispiel "Get Sketch Segment and Curve Data Example (VBA)" an, da hab ich das gerade gefunden Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Rosco Mitglied
Beiträge: 19 Registriert: 29.10.2014 SolidWorks 2013 x64, SP3.0
|
erstellt am: 03. Nov. 2014 14:47 <-- editieren / zitieren --> Unities abgeben:
Hallo Stefan, vielen Dank mal wieder. Da war ich mit dem GetID wohl ein bisschen auf dem Holzweg. Wie zu erwarten war, kommen natürlich wieder mehr Fragen auf: Nachdem ich nun die Punkte, Linie und Ebene erstellt habe, will ich nun ein Kreis bzw. Rechteck auf der erzeugten Ebene erstellen. Code:
Set skPt1 = swPart.SketchManager.CreatePoint(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2)) Set skPt2 = swPart.SketchManager.CreatePoint(DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2))Set skLinie = swPart.SketchManager.CreateLine(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), DefPt2(i, 0), DefPt2(i, 1), DefPt2(i, 2)) skPt1.Select4 False, Nothing ' neue Selektion skLinie.Select4 True, Nothing ' an die vorhandene Selektion anhängen Set skPlane = swPart.SketchManager.CreateSketchPlane(swConstraintType_COINCIDENT, swConstraintType_PERPENDICULAR, swConstraintType_INVALIDCTYPE) Set skCirc = swPart.SketchManager.CreateCircle(DefPt1(i, 0), DefPt1(i, 1), DefPt1(i, 2), DefPt1(i, 0) + Geom / 2000, DefPt1(i, 1), DefPt1(i, 2))
Für die Skizze wird aber offenbar wieder eine der Basisebenen angewählt! Dadurch wird, egal welche Koordinaten ich für den 2. Punkt wähle, der Kreis immer entsprechend der Basisebene ausgerichtet, was in diesem Fall entlang der Linie wäre. Der Kreis soll aber senkrecht dazu ausgerichtet werden. Die erstellte Ebene kann ich aber nicht mehr über select4 auswählen, da der Rückgabewert laut Hilfe nur ein boolean ist. Entsprechend auch kein "SldWorks.SketchSegment" Dim instance As ISketchManager Dim Relation1 As Integer Dim Relation2 As Integer Dim Relation3 As Integer Dim value As Boolean value = instance.CreateSketchPlane(Relation1, Relation2, Relation3) >Muss< ich hier dann wiederum hier mit dem SelectbyID-Befehl arbeiten? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Technischer Produktdesigner / Konstrukteur (m/w/d) Fachrichtung Maschinen- und Anlagenkonstruktion | Die ZIEGRA Eismaschinen GmbH ist ein inhabergeführter, weltweit renommierter Hersteller von gewerblichen und industriellen Eismaschinen sowie -anlagen zur Produkt- und Prozesskühlung. Wir bedienen Kunden in verschiedensten Bereichen der Lebensmittelherstellung und -verarbeitung über Bereiche der Life Science bis hin zu Eisbrunnen in Wellnessanlagen. Die Vielseitigkeit der Anwendungen macht den Reiz der Arbeit mit den Maschinen aus.... | Anzeige ansehen | Technischer Zeichner, Bauzeichner |
|
StefanBerlitz Guter-Geist-Moderator IT Admin (CAx)
Beiträge: 8756 Registriert: 02.03.2000 SunZu sagt: Analysiere die Vorteile, die du aus meinem Ratschlag ziehst. Dann gliedere deine Kräfte entsprechend und mache dir außergewöhnliche Taktiken zunutze.
|
erstellt am: 03. Nov. 2014 15:40 <-- editieren / zitieren --> Unities abgeben: Nur für Rosco
Hallo Rosco, keine Ahnung, ich hab noch nie mit Skizzenebenen gearbeitet, weder in Makros noch interaktiv. Wenn überhaupt würde ich mit "normalen" Referenzebenen arbeiten, da gibt es knapp ein Dutzend API Calls die zu erstellen (hier z.B. ModelDoc2::CreatePlaneThruLineAndPt oder das modernere FeatureManager::InsertRefPlane), das liefert dir auch gleich das Objekt der Ebene zur weiteren Verwendung. Ciao, Stefan ------------------ Inoffizielle deutsche SolidWorks Hilfeseite http://solidworks.cad.de Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|