Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  SolidWorks
  API, VB.NET: MakeSketchBlockFromFile

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



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

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

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


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

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

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



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

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

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


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

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

Hallo Klaus

Zu deinem neuen Problem.
Wähle das Blatt mit

Code:
Boolstatus = swDrw.ActivateSheet(swView.GetName2)
aus.


zu 2.
SelectByID2 verlangt einen String, "swSelectType_e.swSelSHEETS" ist ein Integer. siehe API-Hilfe swSelectType_e Enumeration in den Remarks.

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



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

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

Mann bist du schnell...
Zitat:
Original erstellt von HenryV:
Hallo Klaus

Zu 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


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

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

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



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

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

Danke! Da war's!
So kommt's, wenn man zu schnell drüber liest.

Aber wenn man mit GetFirstView das Blatt erhält, dieses also per Definition auch eine View ist...
warum funktioniert dann ActivateView mit dem Blattname nicht?
Fragen über Fragen...

Egal, es klappt. 

------------------
Klaus

www.al-ko.com | mein Gästebuch

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