| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
| |
| PNY wird von NVIDIA zum Händler des Jahres gewählt – zum dritten Mal in Folge, eine Pressemitteilung
|
Autor
|
Thema: acedCmd aus accore.dll funktioniert beim neuen ACAD 2015 nicht! (3563 mal gelesen)
|
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 29. Mrz. 2014 22:49 <-- editieren / zitieren --> Unities abgeben:
Hallo, bis ACAD2014 habe ich per VB.NET Commands über die Funktion "acedCmd" aus der "accore.dll" (unmanaged) an ACAD gesendet. Etwa so... Code: Public Class Test <CommandMethod("Test")> _ Public Sub Test() ExecuteCommand("-line", "0,0", "0,20", "") End Sub End Class Public Class clsAcadCommand Private Declare Function acedCmd Lib "accore.dll" (ByVal vlist As IntPtr) As Integer
Public Shared Sub ExecuteCommand(ByVal ParamArray args() As Object) Dim rb As ResultBuffer = New ResultBuffer For Each val As Object In args If (val Is Nothing) Then rb.Add(New TypedValue(CType(LispDataType.Text, Integer), "")) ElseIf (TypeOf val Is String) Then rb.Add(New TypedValue(CType(LispDataType.Text, Integer), val)) ElseIf (TypeOf val Is Point2d) Then rb.Add(New TypedValue(CType(LispDataType.Point2d, Integer), val)) ElseIf (TypeOf val Is Point3d) Then rb.Add(New TypedValue(CType(LispDataType.Point3d, Integer), val)) ElseIf (TypeOf val Is ObjectId) Then rb.Add(New TypedValue(CType(LispDataType.ObjectId, Integer), val)) ElseIf (TypeOf val Is SelectionSet) Then rb.Add(New TypedValue(CType(LispDataType.SelectionSet, Integer), val)) ElseIf (TypeOf val Is Double) Then rb.Add(New TypedValue(CType(LispDataType.Double, Integer), val)) ElseIf (TypeOf val Is Short) Then rb.Add(New TypedValue(CType(LispDataType.Int16, Integer), val)) ElseIf (TypeOf val Is Integer) Then rb.Add(New TypedValue(CType(LispDataType.Int32, Integer), val)) ElseIf (TypeOf val Is TypedValue) Then rb.Add(val) End If Next Try Dim iCmdEcho As Integer = Application.GetSystemVariable("CmdEcho") Application.SetSystemVariable("CmdEcho", 0) acedCmd(rb.UnmanagedObject) Application.SetSystemVariable("CmdEcho", iCmdEcho) Catch ex As Exception Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor ed.WriteMessage(ex.Message) Finally rb.Dispose() End Try End Sub End Class
...dies hat bisher gut funktioniert. Beim neuen AutoCAD 2015 bleibt die Funktionsausführung ohne Wirkung. Weiß jemand den Grund woran dies liegen könnte? Im I-Net hab ich noch nichts über das Problem gefunden. Vielen Dank im Voraus, Gruß Werner
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 30. Mrz. 2014 13:18 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
|
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 30. Mrz. 2014 21:15 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, danke für die rasche Antwort. Bei meiner Variante konnte ich der Befehlsfolge SelectionSets oder ObjectID's übergeben. Z.B. so ExecuteCommand("_.PEDIT", ent.ObjectId, "_JOIN", sset, "", "") Bei Document.SendStringToExecute habe ich das nie hinbekommen. Würde dies dort auch funktionieren? Gruß, Werner
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 31. Mrz. 2014 07:45 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
Hallo Werner, abgesehen davon, dass du die Join-Methode eines Curve-Objects für dein Beispiel nehmen kannst, ich helfe mir in solchen Fällen so, dass ich entweder eine Lisp-Funktion, die den Auswahlsatz bildet in die Befehlszeile 'schicke' oder den Command-Aufruf mit einzelnen Elementnamen 'füttere' xxx.SendStringToExecute("_.PEDIT " ..) foreach(ObjectId oid in sset) { xxx.SendStringToExecute("(Handent \"" + _oid.Handle + "\") " ..) } xxx.SendStringToExecute( ...) So in der Art .. das ist jetzt nur so runtergetippt, um das Prinzip aufzuzeigen. Grüße! Holger ------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 31. Mrz. 2014 20:04 <-- editieren / zitieren --> Unities abgeben:
Hallo Holger, Problem gelößt! javascript:InsertSMI(' %20'); Die ARX-Funktion acedCmd heißt jetzt acedCmdS Die Deklaration lautet so Private Declare Function acedCmdS Lib "accore.dll" (ByVal vlist As IntPtr) As Integer und was will man mehr es funkt wieder. Warum dies so ist, ist im AutoCAD 2015 SDK gut beschrieben. Aber trotzdem vielen Dank für Deine Anregungen, das mit dem "Lisp-füttern" war ein guter Ansatz. Bei meiner Command-Methode ist der Vorteil, das die Befehle synchron zum Programm ablaufen und sogar Pausen für Benutzereingaben möglich sind. Ganz so wie beim Lisp-Command. Für alle die es brauchen wollen, hier nochmal die Deklarationen... Vor ACAD 2013 Private Declare Function acedCmd Lib "acad.exe" (ByVal vlist As IntPtr) As Integer Ab ACAD 2013 Private Declare Function acedCmd Lib "accore.dll" (ByVal vlist As IntPtr) As Integer Ab ACAD 2015 Private Declare Function acedCmdS Lib "accore.dll" (ByVal vlist As IntPtr) As Integer Viele Grüße, Werner PS: Dein Hinweis Zitat: abgesehen davon, dass du die Join-Methode eines Curve-Objects für dein Beispiel nehmen kannst
hab ich nicht ganz verstanden. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4187 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 01. Apr. 2014 08:45 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
Zitat: Original erstellt von Wene71: ... PS: Dein Hinweis hab ich nicht ganz verstanden.
Linien, Polylinien, Bögen, ... erben alle von einem Curve-Object und Entity-Object. Auf diese kann man auch die folgenden Methoden, die das Entity-Object mitbringt, anwenden:
Code:
public Autodesk.AutoCAD.Geometry.IntegerCollection JoinEntities(Autodesk.AutoCAD.DatabaseServices.Entity[] otherEntities) Member von Autodesk.AutoCAD.DatabaseServices.Entitypublic void JoinEntity(Autodesk.AutoCAD.DatabaseServices.Entity secondaryEntity) Member von Autodesk.AutoCAD.DatabaseServices.Entity
Diese Methoden sind sozusagen das command: _.PEDIT | _Join Grüße! Holger
------------------ Holger Brischke CAD on demand GmbH Individuelle Lösungen von Heute auf Morgen.
defun-tools Das Download-Portal für AutoCAD-Zusatzprogramme!
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 01. Apr. 2014 09:09 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
Zitat: Beim neuen AutoCAD 2015 bleibt die Funktionsausführung ohne Wirkung. Weiß jemand den Grund woran dies liegen könnte?
Zitat: Die ARX-Funktion acedCmd heißt jetzt acedCmdS
...oder FIBERWORLD aktivieren (Start von AutoCAD, NEXTFIBERWORLD ==> einschalten, AutoCAD neu starten) ------------------
www.cars4fun.at Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
oscarr Mitglied CAD-Manager
Beiträge: 198 Registriert: 02.10.2007 ACA 2012 - English Win 7/x64
|
erstellt am: 01. Apr. 2014 18:44 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
|
Ingenieur Studio HOLLAUS Mitglied CAD / CAFM / GIS Beratung-Programmierung-Schulung
Beiträge: 1049 Registriert: 06.11.2008 Autocad 2 bis Autocad 2020 (+Map3D, +Civil3D, +Infraworks) RKV .... CAFM+mehr HMap ... Vermessung und Verkehr OoC .... Raumplanung CBox ... Tools für AutoCAD und BricsCAD (kostenfrei)
|
erstellt am: 01. Apr. 2014 19:44 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
danke für den Link, schon seit gestern Veröffentlicht und ich hab's noch nicht gefunden Nach dem Link zu Kean Walmsley's Blog könnte man sich den Aufruf in die accore.dll jetzt eigentlich sparen durch Editor.Command bzw. Editor.CommandAsync..wird wohl schnell probiert werden. ------------------
[Diese Nachricht wurde von Ingenieur Studio HOLLAUS am 01. Apr. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Wene71 Mitglied
Beiträge: 28 Registriert: 25.04.2010 Win8.1 Pro x64, ACAD 2015, VS 2013
|
erstellt am: 01. Apr. 2014 21:31 <-- editieren / zitieren --> Unities abgeben:
Hallo, danke für Eure Infos und die Links. Habe gerade ed.command getestet! Funktioniert 1:1 wie der alte ARX-Aufruf. Super Sache, sogar einen PauseToken fürs warten auf Benutzereingaben gibt's jetzt. Und man muss nichts erst in Lisp-Datentypen umwandeln. @Brischke: Hab jetzt verstanden was Du mit Curve-Object gemeint hast. Danke! Grüße, Werner Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Karlovac Mitglied
Beiträge: 54 Registriert: 12.09.2013 AutoCAD Mechanical 2012-2015 Windows 7 Enterprise X64 Visual Studio 2010/2013 Intel Xeon W3680 Nvidia Quadro 2000 16 GB RAM
|
erstellt am: 22. Mai. 2014 14:09 <-- editieren / zitieren --> Unities abgeben: Nur für Wene71
|