| | | Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS | | | | Intertool 2024 |
Autor
|
Thema: API, VB.NET: MakeSketchBlockFromFile (1681 mal gelesen)
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 02. Okt. 2015 12:02 <-- editieren / zitieren --> Unities abgeben:
Ahoi Ihr Experten Ich habe in einem schon älteren und umfangreichen Programm diese Prozedur zum Einfügen eines Blockes auf eine Zeichnung drin, die hier auch wunderbar funktioniert: Code: Sub InsertBlockModelRight() 'swDrw ist vom Typ Drawing, das hat keine Extension :( 'drum muss das erst in Modeldoc2 überführt werden: part Dim part As SolidWorks.Interop.sldworks.ModelDoc2 = swDrw Dim PointCoords(2) As Double Dim Boolstatus As Boolean Dim MathUtil As sldworks.MathUtility = swApp.GetMathUtility Dim MathP As sldworks.MathPoint ' = MathUtil.CreatePoint({0, 0, 0}) ' Dim myBlockDefinition As SolidWorks.Interop.sldworks.BlockDefinition Dim myBlockDefinition As Object If RegTextBlockRightModel = "" Then Exit Sub If swDrw Is Nothing Then Exit Sub Try PointCoords(0) = (paperWidth - 0.19) / sheetScale PointCoords(1) = 0.086 / sheetScale PointCoords(2) = 0.0 Status("Textblock " & RegTextBlockRightModel & " wird eingefügt bei " & _ (PointCoords(0) * 100).ToString & "/" & (PointCoords(1) * 100).ToString) MathP = MathUtil.CreatePoint(PointCoords) Boolstatus = swDrw.ClearSelection 'Der Block soll auf Blattebene, FirstView ist das Blatt. swView = swDrw.GetFirstView If swView Is Nothing Then Exit Sub Boolstatus = swDrw.ActivateView(swView.Name) Boolstatus = part.Extension.SelectByID2(swView.Name, swSelectType_e.swSelSHEETS, 0, 0, 0, False, 0, Nothing, 0) myBlockDefinition = swDrw.SketchManager.MakeSketchBlockFromFile(MathP, RegTextBlockRightModel, False, 1, 0) If myBlockDefinition Is Nothing Then Dim msg As String = "Fehler beim Einfügen des Blocks " & RegTextBlockRightModel Status(msg) MessageBox.Show(msg, FormTitle, MessageBoxButtons.OK, MessageBoxIcon.Error) Else Status("Textblock " & RegTextBlockRightModel & " eingefügt.") End If Catch ex As Exception MessageBox.Show("Fehler beim Einfügen des Blocks" & vbNewLine & RegTextBlockRightModel, FormTitle, MessageBoxButtons.OK, MessageBoxIcon.Error) End Try Status("Bereit") End Sub
Jetzt 2 Fragen/Probleme: 1. myBlockDefinition ist nur als Object definiert, damit klappt's. Wenn ich das aber als SolidWorks.Interop.sldworks.BlockDefinition deklariere (was ja wohl richtig wäre?), dann wird die Methode MakeSketchBlockFromFile zwar ausgeführt, anschließend gibts aber einen Ausnahmefehler "Das COM-Objekt des Typs "System.__ComObject" kann nicht in den Schnittstellentyp "SolidWorks.Interop.sldworks.BlockDefinition" umgewandelt werden." Wieso denn das? ^^ 2. Frage: Die Variable Boolstatus wird hier 3x als Ergebnis von 3 Methoden verwendet, komischerweise bleibt sie immer false. Wieso das denn? ^^ 3. Ich wollte etwas testen, und habe diese Sub in einem neuen kleinen Projekt verbaut, natürlich alles deklariert, versorgt etc. In diesem neuen kleinen Projekt versagt der Code total, der Block wird nie eingefügt, myBlockDefinition bleibt immer Nothing. Ich bin hier ratlos! ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 02. Okt. 2015 15:55 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus Antwort zu 1: Der richtige Dateityp ist SketchBlockDefinition Antwort zu 2: 1: ClearSelection hat kein Rückgabewert
2: Aus dem Beispiel "Activate Each View on Current Sheet Example (VBA)" Returns FALSE if trying to activate the drawing sheet 3: gemäss API-Hilfe lautet die Zeile korrekt so Boolstatus = part.Extension.SelectByID2(swView.Name, "SHEET", 0, 0, 0, False, 0, Nothing, 0) Damit liefert sie auch den korrekten Wert True. Antwort zu 3: Ich habe deinen Code in VB.net 2010 übertragen und getestet. Falls Interesse besteht, kann ich ihn mal posten.
Gruss Andreas ------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 05. Okt. 2015 09:44 <-- editieren / zitieren --> Unities abgeben:
Ahoi Henry, vielen Dank mal wieder, das ist wie üblich die 42 ! zu 1. Hmm... stimmt, BlockDefinition ist wohl veraltet. Sollte das aber nicht trotzdem funktionieren? Egal, jetzt geht's. zu 2.: - 1. stimmt, weiß gar nicht wie ich da drauf komme^^
- 2. stimmt, im Beispiel steht's. Leider nicht direkt in der Beschreibung. Da heißt's nur "True if successful, false if not". Ok, ist jetzt Definitionsssache, ist das Blatt eine View? Wenn ja, müsste es True ergeben, wenn nein, dürfte es durch diese Methode gar nicht gefunden werden. Aber gut ...
- 3. Wieso funktioniert das nicht, wenn ich die Konstante swSelSHEETS verwende, ich denke, die steht für "SHEET"? Auch wenn ich das ausschreibe als "SolidWorks.Interop.swconst.swSelectType_e.swSelSHEETS" sagt mir die Überwachung, swSelectType_e sei kein Member von "swconst". Obwohl mir das beim Schreiben sogar vorgeschlagen wird!
Ok, mit "SHEET" funktionierts, aber verstehen tu ich das nicht. Aber man muss ja nicht alles verstehen...
Zu 3.: So, Änderungen eingefügt und getestet: Und jetzt habe ich auch meinen Hauptfehler gefunden, wegen dem es im Testprogramm nicht funktioniert hat, es ist richtig peinlich: in der Deklaration des Dateinamens waren 2 Anführungszeichen am Ende zu viel drin - Asche über mein Haupt! Aber jetzt funktioniert es in beiden Programmen gleich gut (oder schlecht, s.u.). Soeben habe ich das nächste Problem festgestellt: Eigentlich soll dieser Block immer auf Blattebene abgelegt werden, dazu habe ich ja "Boolstatus = swDrw.ActivateView(swView.Name)" und "Boolstatus = part.Extension.SelectByID2(swView.Name, "SHEET", 0, 0, 0, False, 0, Nothing, 0)" drin stehen, mit swView.Name="Blatt1" (wir arbeiten nur ausnahmsweise mit mehreren Blättern, dieser spezielle Block wird nur auf Blatt1 benötigt). Nur leider funktioniert das auch nicht: Wenn der User zu diesem Zeitpunkt gerade eine View aktiv hat, dann wird der Block in diese View eingefügt. Auch ein ClearSelection2 ändert daran nichts.
------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 05. Okt. 2015 10:27 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
|
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 05. Okt. 2015 10:49 <-- editieren / zitieren --> Unities abgeben:
Mann bist du schnell... Zitat: Original erstellt von HenryV: Hallo KlausZu deinem neuen Problem. Wähle das Blatt mit Code: Boolstatus = swDrw.ActivateSheet(swView.GetName2)
aus.
Das macht leider keinen Unterschied. Ist auch klar, beide geben "Blatt1" zurück. swView.Name ist zwar Obsolet, muss ja aber immer noch funktionieren, bisher war die API immer abwärtskompatibel. Wäre schlimm, wenn man alle Programme nach jedem Versionswechsel kommplett überarbeiten müsste.
Zitat: zu 2. SelectByID2 verlangt einen String, "swSelectType_e.swSelSHEETS" ist ein Integer. siehe API-Hilfe swSelectType_e Enumeration in den Remarks.Gruss Andreas
Du hast recht, da ist die Hilfe aber nicht so richtig deutlich verständlich. Ich verstehe auch nicht, was sich die Programmierer dabei gedacht haben. Was nutzt mir so eine Enumeration, wenn ich sie dann nicht verwenden kann? Da sind die verschiedenen Methoden inkonsequent programmiert. Aber du hast recht, und damit funktioniert SelectByID2. ------------------ Klaus www.al-ko.com | mein Gästebuch Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 05. Okt. 2015 11:09 <-- editieren / zitieren --> Unities abgeben: Nur für KMassler
Hallo Klaus Ich bin mir nicht sicher ob du mich richtig verstanden hast. Ich meinte das "ActivateSheet", da du in deinem Code mit "ActivateView" arbeitest. Gruss Andreas ------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
KMassler Ehrenmitglied V.I.P. h.c. CAD Admin + Mädchen für Alles...
Beiträge: 2675 Registriert: 06.11.2000 SolidWorks Start 1999 ** CSWP 01/2008 ** ------------------ Zuletzt beruflich: - SWX2020 SP5; - SAP/PLM+ECTR; - DriveWorks Pro; - Programmierung: VBA, aktuell Visual Studio 2022/VB.Net ------------------ ab 2024 (privat): Onshape und anderes
|
erstellt am: 05. Okt. 2015 11:41 <-- editieren / zitieren --> Unities abgeben:
|
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|