Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API: Part automatisiert erstellen (variabel)

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 SOLIDWORKS
  
SPINNER Hausausstellung
Autor Thema:  API: Part automatisiert erstellen (variabel) (2856 mal gelesen)
Rosco
Mitglied



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

Beiträge: 19
Registriert: 29.10.2014

SolidWorks 2013 x64, SP3.0

erstellt am: 29. Okt. 2014 16:07    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 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



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

Beiträge: 19
Registriert: 29.10.2014

SolidWorks 2013 x64, SP3.0

erstellt am: 30. Okt. 2014 08:35    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

Habe noch 2,3 Fehler entdeckt und korrigiert.

P.S.: sollten Fragen bestehen, nur zu. Bin für jede Hilfe dankbar!

[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)



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

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 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 Rosco 10 Unities + Antwort hilfreich

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



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

Beiträge: 19
Registriert: 29.10.2014

SolidWorks 2013 x64, SP3.0

erstellt am: 30. Okt. 2014 10:05    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


Beispiel_Traegermodell.JPG

 
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



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

Beiträge: 19
Registriert: 29.10.2014

SolidWorks 2013 x64, SP3.0

erstellt am: 30. Okt. 2014 11:40    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

Um vielleicht das aktuelle Problem noch einmal zusammenzufassen:

Ich würde gern eine Ebene erstellen, mit den Eigenschaften: geht durch Punkt1 und ist senkrecht zu Linie1.
Darauf will ich denn einen Kreis/Rechteck erzeugen mit Mittelpunkt Punkt1. Daraus soll ein linearer Aufsatz erzeugt werden, entlang Linie1.

Die Ebenenerstellung ist aktuell das Problem. Ich habe aktuell die Linie1 mit Anfangs- und Enpunkt. Kann ich über den code also eine Ebene erzeugen, die direkt diese Eigenschaften hat oder kann ich nur eine Ebene irgendwo erzeugen und muss ich diese im Nachhinein mit Beziehungen Positionieren?

Wenn ersteres möglich ist, habe ich bisher noch nichts entsprechendes gefunden und wäre dankbar für Hilfe.

Zu Thema GetID habe ich bisher nur die beiden sachen hier gefunden:
http://ww3.cad.de/foren/ubb/Forum2/HTML/010112.shtml#000000
http://ww3.cad.de/foren/ubb/Forum2/HTML/016350.shtml#000001

aus dem letzteren Link habe ich mal das Beispiel aus der API versucht zu starten (Skizze aktiviert im hintergrund), bekomme aber einen Fehler (Typen unverträglich) bei

Code:

    Set swDraw = swModel



--> API-Hilfe:
http://help.solidworks.com/2014/english/api/sldworksapi/get_all_sketch_segments_in_drawing_template_example_vb.htm

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

StefanBerlitz
Guter-Geist-Moderator
IT Admin (CAx)



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

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 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 Rosco 10 Unities + Antwort hilfreich

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



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

Beiträge: 19
Registriert: 29.10.2014

SolidWorks 2013 x64, SP3.0

erstellt am: 30. Okt. 2014 15:13    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

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)



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

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 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 Rosco 10 Unities + Antwort hilfreich

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



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

Beiträge: 19
Registriert: 29.10.2014

SolidWorks 2013 x64, SP3.0

erstellt am: 03. Nov. 2014 14:47    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 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 ansehenTechnischer Zeichner, Bauzeichner
StefanBerlitz
Guter-Geist-Moderator
IT Admin (CAx)



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

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 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 Rosco 10 Unities + Antwort hilfreich

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 >>)

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)2024 CAD.de | Impressum | Datenschutz