Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  AutoCAD ObjectARX und .NET
  COM-Programmierung ProSteel 3D

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 Autodesk Produkte
Autor Thema:  COM-Programmierung ProSteel 3D (2209 mal gelesen)
facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

erstellt am: 14. Apr. 2009 14: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

Hallo,
ich poste mal hier bei AutoCAD ARX Object, weil ich denke das ist näher am Thema als im ProSteel-Thread.

Ich habe von Kiwi/Bentley eine Anleitung zur COM-Programmierung von ProSteel 3D bekommen, leider als VB6 bzw. VBA.
Ich würde das aber gerne in VB.NET umsetzen, aber habe paar Übersetzungsprobleme.

Erst einmal der VB6 Code:

Code:
Sub IsProSteelRunning()
    Dim Obj As Object
    Dim acadApp As Object
    Dim acadDoc As Object
    Dim Result As Boolean
   
    On Error Resume Next
   
    ‘ Überprüfen ob schon eine AutoCAD Instanz aktiv ist!
    Set acadApp = GetObject(, "AutoCAD.Application")
    If Err.Number = 0 Then

        Result = True
   
    Else
       
        Err.Clear
       
‘ Wenn keine active AutoCAD Instanz vorhanden ist, dann erzeugen    ‘ wir eine neue Instanz.
        Set acadApp = CreateObject("AutoCAD.Application")
       
        If Err.Number = 0 Then
       
            Result = True
           
        Else
       
            Result = False
            MsgBox Err.Description
           
        End If
       
    End If
   
    If Result Then
           
        Set acadDoc = acadApp.ActiveDocument
       
        acadApp.Visible = True

’ Hier wird das ProSteel Object initialisiert.       
Set Obj = acadApp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication")
       
        If Not Obj Is Nothing Then
           
            MsgBox "Found installed ProSteel with " & Obj.VersionString
            MsgBox "Found Datapath = " & Obj.GetGlobalSettings.DataPath
       
        End If
           
    End If
       
End Sub


Ist bis hierhin alles logisch, jetzt mein VB.NET Code, ein wenig abgespeckt, aber soll erstmal nur zeigen oder
nicht zeigen, dass es funktioniert.

Code:
Imports Autodesk.AutoCAD.Interop
Imports PSCOMWRAPPERLib
Imports System.IO

Public Class Form1


    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim acadapp As AcadApplication = New AcadApplication
        Dim acaddoc As AcadDocument = New AcadDocument
        Dim psobj As PSCOMWRAPPERLib.Ks_ComApplication = New PSCOMWRAPPERLib.Ks_ComApplication

        MsgBox(psobj.VersionString)
    End Sub
End Class


...Und es funktioniert nicht, hätte mich auch gewundert. ich komme mit folgenenden Code nicht zurecht:

Code:
Set Obj = acadApp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication")

In meinen Worten ausgedrückt, ermittle ich das ProSteel Objekt aus dem AutoCAD-Application-Obj, oder ich lasse es von
AutoCAD-APplication-Objekt ermitteln.
Somit sind die beiden ja "verbunden".

Bei meinem Code erzeuge ja 2 von einander getrennte Objekte ... so verstehe ich das

Könnte mir jemand helfen, wie ich das in VB.NET anstellen kann.

Ich möchte auch nicht in VB.NET die VB6 Routinen aufrufen, ich möchte alles "sauber" in .NET machen.

Danke schonmal...

Gruss Alex

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


Ex-Mitglied

erstellt am: 14. Apr. 2009 19:46    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Alex,

um die Frage zu beantworten fehlt eine wesentliche Info: läuft Deine App als AutoCAD-Applikation (sprich mit 'netload' geladen) oder ist es ein externes EXE, das AutoCAD von außen ansteuert?

Dazu noch: wieso verwendest Du nicht laut der VB6-Vorlage die Zeile:
  Set Obj = acadApp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication")
gleichermaßen in dotNET?

- alfred -

------------------
www.hollaus.at

facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

erstellt am: 15. Apr. 2009 12:14    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 Alfred,
sorry, dass ich erst so spät mich melde, aber ich musste noch "fix" 2 Rechner tauschen.

Also das Programm soll im 1. Step eine externe EXE werden, sehe noch keinen Grund das als dll zu machen.

Ich habe es gestern mal mit folgenden Code mit erfolg probiert:

Code:
Dim acadapp As AcadApplication = New AcadApplication
        Dim acaddoc As AcadDocument
        Dim psobj As Object
        psobj = acadapp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication")
        MsgBox(psobj.VersionString)

ABER dann habe ich kein Intellisense bei den psobj, also wenn ich "." ... tippe kommen nur die .NET Standart Methoden.
Manche werden lächeln, aber mir ist es schon wichtig mit Intellisense zu arbeiten.
Auf den ersten Blick, sagen unbedarfte das hilft nur beim tippen, aber man erspart sich Fehler beim Tippen und noch
als Fehlerkontrolle, ist eine Methode nicht da, dann hat das einen Grund ;-)
Oder ich gucke einfach mal was es in dem Objekt so gibt, manchmal stößt man bei dem Namen schon auf was.

Gruss Alex

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


Ex-Mitglied

erstellt am: 15. Apr. 2009 18:22    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi,

dann probiers mal so:

Code:
Dim psobj As PSCOMWRAPPERLib.Ks_ComApplication = Nothing
psobj = TryCast(acadapp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication"),PSCOMWRAPPERLib.Ks_ComApplication)
If psobj isNot Nothing Then
  '...hat funktioniert
Else
  '...hat nicht funktioniert
End If

- alfred -

------------------
www.hollaus.at

facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

erstellt am: 16. Apr. 2009 12:50    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 Alfred,

ich bin wieder einmal begeistert, es funktioniert wunderbar.

Auf das Casten wäre ich im Traum nicht gekommen, aber als blutiger Anfänger muß man ja nicht alles
wissen. ;-)

Ich danke Dir recht herzlich!!!

Gruss Alex

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

facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

Windows 7 Professional 64Bit
AutoCAD 2007/2008/2009
ProSteel 3D 17.2/18.0/V8i
ProStructures V8i_S3
Visual Studio 2010 Ultimate

erstellt am: 27. Apr. 2009 11:01    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

Guten Morgen,

ich will nicht so in die Gänge kommen mit .NET & ProSteel :-(

(nicht wundern, ich probiere Stück für Stück, wenn zeit ist)

Ich habe folgenden Code in VB gegeben:
im Globalen Teil...
  

Zitat:
Dim CreatePlate As Ks_ComCreatePlate
Dim Matrix As Ks_ComMatrix
Dim Origin As Ks_ComPoint
Dim XAxis As Ks_ComVector
Dim YAxis As Ks_ComVector
Dim PlateObject As Ks_ComPlate

dann in der Prozedur (e.g. Button)...

  

Zitat:
Set CreatePlate = New Ks_ComCreatePlate
Set Matrix = New Ks_ComMatrix
Set Origin = New Ks_ComPoint
Set XAxis = New Ks_ComVector
Set YAxis = New Ks_ComVector

CreatePlate.SetAsRectangularPlate 200#, 50#
CreatePlate.SetThickness 5#

Origin.x = 100

XAxis.y = 1
YAxis.z = 1
Matrix.SetCoordinateSystem Origin.Point, XAxis.Vector, YAxis.Vector  CreatePlate.SetInsertMatrix Matrix.Matrix

CreatePlate.Create

Set PlateObject = CreatePlate.Entity
PlateObject.PosNumber = "12"


Wie gesagt, das ist VBA, ich zweifle auch nicht, dass es VB in ACAD läuft.

Ich habe jetzt versucht, das ganze per .NET nachzubauen:

Code:

sub testen()
Dim acadapp As AcadApplication = New AcadApplication
        Dim psobj As PSCOMWRAPPERLib.Ks_ComApplication = Nothing
        psobj = TryCast(acadapp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication"), PSCOMWRAPPERLib.Ks_ComApplication)
        If psobj IsNot Nothing Then
            CreatePlate = New Ks_ComPlate
            Matrix = New Ks_ComMatrix
            Origin = New Ks_ComPoint
            XAxis = New Ks_ComVector
            YAxis = New Ks_ComVector
            acadapp.Visible = True
            CreatePlate.SetAsRectangularPlate(200.0#, 50.0#)
            CreatePlate.SetThickness(50.0#)

            Origin.x = 100
            XAxis.y = 1
            YAxis.z = 1

            Matrix.SetCoordinateSystem(Origin.Point, XAxis.Vector, YAxis.Vector)
            CreatePlate.SetInsertMatrix(Matrix.Matrix)
            PlateObjekt = CreatePlate.Entity
            PlateObjekt.PosNumber = "12"
        Else
            '...hat nicht funktioniert
        End If
        acadapp.Quit()

    End Sub


Der Fehler kommt, bei KS_* das er z.B. KS_ComMatrix nicht kennt.
Im Intelisense habe ich es drin, aber wenn es ausführe, kommt ein Error.


System.IO.FileNotFoundException wurde nicht behandelt.
  Message="Die COM-Klassenfactory für die Komponente mit CLSID {D9D74E44-3977-11D5-8904-0080C8E28BCB} konnte aufgrund des folgenden Fehlers nicht abgerufen werden: 8007007e."
  Source="TestProSteel"
  StackTrace:
       bei TestProSteel.Form1.Button3_Click(Object sender, EventArgs e) in C:\Dokumente und Einstellungen\alki\Eigene Dateien\Visual Studio 2005\Projects\TestProSteel\TestProSteel\Form1.vb:Zeile 44.
       bei System.Windows.Forms.Control.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnClick(EventArgs e)
       bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
       bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
       bei System.Windows.Forms.Control.WndProc(Message& m)
       bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
       bei System.Windows.Forms.Button.WndProc(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
       bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
       bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
       bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
       bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
       bei System.Windows.Forms.Application.Run(ApplicationContext context)
       bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
       bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
       bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
       bei TestProSteel.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
       bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       bei System.Threading.ThreadHelper.ThreadStart()

Ich ahne, dass die Objekte falsch referenziert sind, das er sie nicht findet,oder?

Hat jemand eine Idee, ich habe auch schon getestet, das ich über das psobj ran komme, aber das geht auch nicht :-(


Gruss Alex

[Diese Nachricht wurde von facebraker am 27. Apr. 2009 editiert.]

[Diese Nachricht wurde von facebraker am 27. Apr. 2009 editiert.]

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

facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

erstellt am: 27. Apr. 2009 15:10    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,

ich habe es nochmal mit:

Code:
CreatePlate = New PSCOMWRAPPERLib.Ks_ComPlate
Matrix = New PSCOMWRAPPERLib.Ks_ComMatrix
Origin = New PSCOMWRAPPERLib.Ks_ComPoint
XAxis = New PSCOMWRAPPERLib.Ks_ComVector
YAxis = New PSCOMWRAPPERLib.Ks_ComVector

Probiert, dass es besser referenziert wird, aber kommt der gleiche Fehler :-(

Gruss Alex

[Diese Nachricht wurde von facebraker am 27. Apr. 2009 editiert.]

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

facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

Windows 7 Professional 64Bit
AutoCAD 2007/2008/2009
ProSteel 3D 17.2/18.0/V8i
ProStructures V8i_S3
Visual Studio 2010 Ultimate

erstellt am: 27. Apr. 2009 15:29    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, ich habe es auch folgendermaßen versucht, analog zum Vorgehen wie bei dem ApplicationObjekt.

Code:
CreatePlate = TryCast(acadapp.GetInterfaceObject("PSCOMWRAPPERLib.Ks_ComPlate"), PSCOMWRAPPERLib.Ks_ComPlate)

Funktioniert auch nicht, er wirft eine Exeption.

Gruss ALex

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


Ex-Mitglied

erstellt am: 27. Apr. 2009 19:19    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi, 
Zitat:
Wie gesagt, das ist VBA, ich zweifle auch nicht, dass es VB in ACAD läuft.
...auch wenn Du nicht daran zweifelst, probiers trotzdem mal aus, sind ja nur ein paar Zeilen. Soweit ich das vermute (bestimmen kann ich es mangels fehlender ProSteel-Version nicht) scheint es, als seien die ActiveX-Komponenten nicht registriert.

- alfred -

------------------
www.hollaus.at

facebraker
Mitglied
IT


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

Beiträge: 158
Registriert: 03.05.2009

erstellt am: 29. Apr. 2009 14:36    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 Alfred,

ich gebs zu, das hätte schon im Vorhinein checken müssen, anstatt nur zu glauben ;-)

Aber leider, funktioniert es im AutoCAD, ich muss aber sagen, dass es nicht das reine AutoCAD ist, sondern ein AutoCAD, welches ProSteel nachläd, d.h. per "demand Load".

Die Frage ist, ist es beim .NET dann da, das PSCOMWRAPPER-Objekt.

Bei dem ersten Test, mußte ich ja das Objekt, noch so "laden":

Code:
psobj = TryCast(acadapp.GetInterfaceObject("PSCOMWRAPPER.Ks_ComApplication"),PSCOMWRAPPERLib.Ks_ComApplication)

Aber bei dem Plate-Beispiel fällt mir nichts dazu ein :-(

Gruss ALex

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


Ex-Mitglied

erstellt am: 29. Apr. 2009 20:09    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat

Hi Alex,

das einzige, was mir dazu einfällt, wäre dann noch, dass Du entweder in Deinem Projekt nicht zu allen ActiveX-Komponenten Verweise gesetzt hast (müssen im Prinzip auch die gleichen wie in Deinem DVB sein) oder die daraus generierten Interop.dll's nicht in Deinem bin-Verzeichnis landen (lokale Kopie nicht auf TRUE gesetzt in den Verweisen).

Aber das ist leider nur mehr Raterei, wirklich helfen kann ich Dir jetzt nicht mehr, da ich kein ProSteel zum Probieren habe. Möglichkeiten gibt es jede Menge, bis hin zu Typ-Konflikten, wo die Erzeugung der Interop.dll's fehlschlägt (war sogar bei AutoCAD 2005 so, dass händisch in die Interop-Generierung eingegriffen werden musste).

Sorry, - alfred -

------------------
www.hollaus.at

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