| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Vb.net COM-Object Beispiel (3887 mal gelesen)
|
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 20. Mrz. 2011 20:02 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich bin bisher mit VBA gearbeitet (dvb) und ich möchte mit vb.net starten. Ich habe mit vb.net (2010) eine kleine Anwendung programmiert als Beispiel aber gibt’s zu wenig Hilfe für COM befehle und Objekte, ich wollte keine <CommandMethod> benutzen. Mein Frage wie kann ich den Eigenschaften für Line, definieren, z.B Layer, Farbe, Thickness… ? Ich bin für jeden Tipp dankbar. Code:
Code:
Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.Interop Imports Autodesk.AutoCAD.Interop.Common Imports Autodesk.AutoCAD.GeometryPublic Class Form1 Private Property Result As Boolean Public AcadApp As Autodesk.AutoCAD.Interop.AcadApplication Private Sub ButtonDrawLine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDrawLine.Click Dim objLine As Autodesk.AutoCAD.Interop.Common.AcadLine Dim StartPt(0 To 2) As Double Dim EndPt(0 To 2) As Double 'Start and End Points StartPt(0) = 0 StartPt(1) = 0 StartPt(2) = 0 EndPt(0) = 5 EndPt(1) = 5 EndPt(2) = 0 AcadApp = CType(GetObject(, "AutoCAD.Application.18.1"), Autodesk.AutoCAD.Interop.AcadApplication) objLine = AcadApp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt) End Sub End Class
im Voraus vielen dank vbCadUser Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Mrz. 2011 20:06 <-- editieren / zitieren -->
Hi, herzlich willkommen bei CAD-de! Code: tLine.Layer = "0" tLine.color = Interop.Common.ACAD_COLOR.acByLayer tLine.Lineweight = Interop.Common.ACAD_LWEIGHT.acLnWtByLayer
HTH, - alfred - ------------------ www.hollaus.at |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 20. Mrz. 2011 20:25 <-- editieren / zitieren --> Unities abgeben:
Das war schnellste Antwort, vielen Dank für die schnelle und ausführliche Antwort, Ich bin grade beim umsteigen von VBA nach vb.net und bestimmt gibt’s noch viel Fragen. Vielen Dank nochmal alfred Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 20. Mrz. 2011 21:03 <-- editieren / zitieren --> Unities abgeben:
|
Ex-Mitglied
|
erstellt am: 20. Mrz. 2011 21:06 <-- editieren / zitieren -->
Hi, >> aber mein versuche hatte kein erfolg Gib uns mal Hinweise dazu! Du versuchst 'wie' das Programm zu laden? AutoCAD meldet 'was', wenn Du obiges versuchst? Welche AutoCAD-Version verwendest Du eigentlich? Bitte >>> SysInfo ausfüllen <<<! - alfred - ------------------ www.hollaus.at [Diese Nachricht wurde von a.n. am 20. Mrz. 2011 editiert.] |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 20. Mrz. 2011 22:31 <-- editieren / zitieren --> Unities abgeben:
Ich habe versucht wie du geschrieben, aber kommt Fehlermeldung und es war „Commen ist kein Member von Autodesk.AutoCAD.Runtime.Interop“ und Ich habe anders geschrieben wie Code unten und war OK aber warum diese Fehler?? Danke alfred Code:
Private Sub ButtonDrawLine_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDrawLine.Click Dim objLine As Autodesk.AutoCAD.Interop.Common.AcadLine Dim StartPt(0 To 2) As Double Dim EndPt(0 To 2) As Double Dim objOffsetDist As Double = 1.0 'Start and End Points StartPt(0) = 0 StartPt(1) = 0 StartPt(2) = 0 EndPt(0) = 5 EndPt(1) = 5 EndPt(2) = 0 AcadApp = CType(GetObject(, "AutoCAD.Application.18.1"), Autodesk.AutoCAD.Interop.AcadApplication) objLine = AcadApp.ActiveDocument.ModelSpace.AddLine(StartPt, EndPt) objLine.Layer = "0" '................................................ OK ' >> tLine.color = Interop.Common.ACAD_COLOR.acByLayer objLine.color = ACAD_COLOR.acGreen '.................................. OK ' >> tLine.Lineweight = Interop.Common.ACAD_LWEIGHT.acLnWtByLayer objLine.Lineweight = ACAD_LWEIGHT.acLnWt050 '......................... OK End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 20. Mrz. 2011 23:11 <-- editieren / zitieren -->
Hi, mein Beispiel war wirklich nur ein Minibeispiel, die 'Anpassung' an Deine Umgebung ist schon Deine Arbeit. Zum einen habe ich die Linie mit dem Variablennamen 'tLine' getauft, dass Du das an Deinen Variablennamen angepasst hast 'objLine' war richtig (und notwendig). Die Anweisung z.B. für die Farbe durch '= Interop.Common.ACAD_COLOR.acByLayer' kommt bei mir dadurch, dass ich im Header des VB-Files nur folgenden Import verwende: Imports Autodesk.AutoCAD Der gesamte Enum-Member 'acByLayer' ist für den Farbindexwert aber so anzusprechen: Autodesk.AutoCAD.Interop.Common.ACAD_COLOR.acByLayer Die Import-Statements sind dafür da, dass man nicht den gesamten Namespace-/Assemblynamen durchschreiben muss, damit kannst Du folgende Kombinationen erzielen (ich schreib's jetzt hintereinander, aber die Imports im Code müssen dann ganz oben stehen):
Code: Imports Autodesk objLine.color = AutoCAD.Interop.Common.ACAD_COLOR.acGreen- oder - Imports Autodesk.AutoCAD objLine.color = Interop.Common.ACAD_COLOR.acGreen - oder - Imports Autodesk.AutoCAD.Interop objLine.color = Common.ACAD_COLOR.acGreen
Du siehst, es verhält sich wie eine Pfad-Angabe (nur halt mit Punkt statt Backslash). Je mehr aus dem vollen Namespace-Namen oben bei Imports angeführt ist, umso weniger musst Du im Code dann tippen. Das war mal die Erklärung (hoffentlich für Dich verständlich), wieso mein Statement (mit anderer Imports-Angabe) bei Dir nicht gefunkt hat. Dazu kommt aber noch: mit den Imports muss sorgsam umgegangen werden, denn eine Namensangabe (einer Class, einer Function, einer Sub, eines Enum's) muss immer eindeutig sein, als Beispiel:
Code: Imports System.Windows.Shapes Imports Autodesk.AutoCAD.DatabaseServicesDim tLine as Line = new Line(....
....führt zu dem Problem, dass in beiden per Import angegeben Assembly-Namen eine Klassendefinition namens 'Line' vorhanden ist. Der Compiler weiß jetzt nicht mehr, von welchem Objekt Du jetzt sprichst, wenn Du 'Line' meinst. Als Abhilfe ist dann so vorzugehen, dass die angeführte Bezeichnung eindeutig wird, z.B. so
Code: Imports System.Windows Imports Autodesk.AutoCADDim tLine1 as Shapes.Line = new Shapes.Line(... Dim tLine2 as DatabaseServices.Line = new DatabaseServices.Line(...
Hoffe, dass es verständlich ist! Weiter noch viel Erfolg. - alfred - ------------------ www.hollaus.at |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 21. Mrz. 2011 19:59 <-- editieren / zitieren --> Unities abgeben:
Hi, Dankschön für Super Erklärung , Ich werde nochmal alle Beispiel ausprobieren, aber wie du sagst wenn man vorher alle bei „Imports“ Definieren dann werde bisschen einfache, komische Weise gibt’s viel Beispiel für „CommandMethod“ aber für COM-Object fast seltene Beispiel im Internet. Vielen Dank nochmal für ausführliche Erklärung und Ich hoffe Ich Störe keine mit mein Einfache Fragen. vbCadUser
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 21. Mrz. 2011 20:09 <-- editieren / zitieren -->
Hi, >> Ich hoffe Ich Störe keine mit mein Einfache Fragen. Nee, lass Dich mal nicht vom Fragen abhalten (solange Du zuerst selbst versucht hast ), letztlich ist ja ein Forum dafür da, dass weitergeholfen wird. - alfred - ------------------ www.hollaus.at |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 23. Mrz. 2011 21:12 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich bin wieder auf dem weg mit Vb.net, Ich habe alle Variant ausprobiert und alles geklappt, Ich habe auch „Circle“ auf dem gleichen Art und Weise ausprobiert und kein Problem aber mit dem Punkt hatte etwas nicht geklappt und zwar mit dem „ Pdmode“ und Pdsize“ im code zeigt kein Fehler aber bei ausführen Zeigt diese Meldung :
„System.MissingMemberException wurde nicht behandelt“ „Der offentliche Member pdmode für den Typ AcadPointClass wurde nicht gefunden. „ danke im Voraus vbCadUser
Code:
Imports Autodesk.AutoCAD.ApplicationServices Imports Autodesk.AutoCAD.DatabaseServices Imports Autodesk.AutoCAD.EditorInput Imports Autodesk.AutoCAD.Runtime Imports Autodesk.AutoCADImports Autodesk.AutoCAD.Interop Imports Autodesk.AutoCAD.Interop.Common Imports Autodesk.AutoCAD.GraphicsInterface Imports Autodesk.AutoCAD.GraphicsSystem Imports Autodesk.AutoCAD.Colors Imports Autodesk.AutoCAD.Geometry Imports Autodesk.AutoCAD.DatabaseServices.Shape Imports System Imports System.Windows Imports System.IO Imports System.Text Imports System.Data Imports System.Globalization Imports System.Collections Imports System.Runtime.InteropServices Imports System.Reflection
Public AcadApp As Autodesk.AutoCAD.Interop.AcadApplication Private Sub ButtonDrawPoint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonDrawPoint.Click Dim objPoint As Autodesk.AutoCAD.Interop.Common.AcadPoint Dim Pt(0 To 2) As Double 'Point Pt(0) = 5 Pt(1) = 5 Pt(2) = 0 ' AcadApp = CType(GetObject(, "AutoCAD.Application.18.1"), Autodesk.AutoCAD.Interop.AcadApplication) objPoint = AcadApp.ActiveDocument.ModelSpace.AddPoint(Pt) objPoint.color = ACAD_COLOR.acYellow objPoint.pdmode = 34 objPoint.pdsize = 1 AcadApp.ZoomExtents() End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 23. Mrz. 2011 21:36 <-- editieren / zitieren -->
Hi, die AcadApp-Variable befüllst Du ungünstig, denn Du schickst den Computer auf die Reise, ob er einen ActiveX-Server findet und hast den eigentlich schon in der Hand. Gefährlicher noch: wenn Du 2 AutoCAD-Sessions geöffnet hast, könnte Dir passieren, dass Du mit diesem Aufruf die App vom anderen AutoCAD bekommst und dann dort zeichnest. Tausche daher Dein 'AcadApp = ...' aus gegen:
Code: Dim tAcadDoc As ApplicationServices.Document = ApplicationServices.Application.DocumentManager.MdiActiveDocument 'und das nachfolgende ist jetzt Dein aktives Document (COM-Interface-basierend): Dim tAcadDocCOM As Interop.AcadDocument = CType(tAcadDoc.AcadDocument, Interop.AcadDocument)
Zugegeben, das funkt natürlich nur, wenn Deine Applikation eine DLL ist, die mit NETLOAD ins AutoCAD hineingeladen wird!Zum Thema Punktanzeigemodus: Das ist keine Zuweisung, die Du einem Punkt zuordnen kannst, das ist eine Eigenschaft der Zeichnung. Du kannst im AutoCAD ja auch nicht einem Punkt sagen, er soll sich darstellen wie ein Kreis, dem anderen wie ein Kreuz! Siehe dazu auch DDPTYPE Und in der Zeichnung kannst Du das so umstellen:
Code: tAcadDocCOM.SetVariable("PDMODE", 0)
Eigentlich bemerkst Du das schon beim Tippen des Codes, oder? Wenn Du mal dieses eintippst: objPoint.p ...dann siehst Du schon in der aufklappenden Liste, dass mit 'p' nur mehr zwei Möglichkeiten vorhanden sind! HTH, - alfred - ------------------ www.hollaus.at |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 23. Mrz. 2011 22:34 <-- editieren / zitieren --> Unities abgeben:
Hi, erscheint kein Weg vorbei ohne DLL und NETLOAD, Ich wollte mein alte Programme (dvb) so programmieren das AutoCAD extern gesteuert mit (exe), aber das wohl nicht einfach und einige Wege nicht möglich , So Ich werde nochmal von vorne mit DLL und NETLOAD und Line, Circle und Point und Text, Viele Jahre mit VBA und dvb war ganz einfach jetzt wieder neu Lernen, Ich werde wieder mit neuem Weg gehen und gibt’s bestimmt noch viel Fragen. Ich bin sehr dankbar für die Hilfe und deine Tipps alfred. vbCadUser
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 25. Mrz. 2011 20:15 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich bin wieder bei meinem Versuche, Normale weg war AutoCAD Öffnen und dann NETLOAD und dann DLL Name Tippen. gibt’s einer Möglichkeit das Ich durch VB.net der DLL ins AutoCAD uploaden ohne das Ich selbst ins AutoCAD Tippen. Ich wollte mein alle DLL und Hilfs Dateien von meinem Haupt Programm (exe) in einem Ordner und dann bei Programm Ausführen ruft AutoCAD und dann Ladet NETLOAD und dann DLL automatisch. mein Frage Klingt komisch aber nur Versuche . danke im Voraus vbCadUser
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ex-Mitglied
|
erstellt am: 25. Mrz. 2011 21:00 <-- editieren / zitieren -->
|
vbCadUser Mitglied
Beiträge: 9 Registriert: 18.03.2011 MS Windows Ultimate 7 AMD Phenom II X4 940 64 bit RAM 8 GB NVIDIA GTS460 Inventor Suite Pro 2011
|
erstellt am: 29. Mrz. 2011 21:48 <-- editieren / zitieren --> Unities abgeben:
|