| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte |
Autor
|
Thema: Kompilieren in Version 2012 bis 2015 (2287 mal gelesen)
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 09. Jan. 2015 18:52 <-- editieren / zitieren --> Unities abgeben:
Generell meine Frage: Beim Kompilieren in C# kommt es immer darauf an die richtigen Biblioteken in den jeweiligen Versionen anzugeben. Jetzt kann ich mir allerdings nur schwer vorstellen, dass der Profi dazu das geschriebene Projekt auf die einzelnen Versionen anpasst. Sprich händisch Acdbmgd, Acmgd und die entspr. Debug-Acadversion, bspw. C:\Program Files\Autodesk\AutoCAD Civil 3D 2012\acad.exe angibt. Gibt es da einen einfacheren Weg ? Ich bin da ja ein wenig von LISP verwöhnt, da geht´s auf anhieb. Als zweites finde ich es äusserst langweilig, wenn man kompiliert, dass dan Acad erst gestartet werden muss. Muss das sein, oder kann man den Vorgang vorher schon abbrechen. In meinem Beispiel wird die DumpObjects.dll ziehmlich schnell erzeugt. Wer kann mir ein wenig Aufklärung dazu geben. Fleissarbeit, biete 2012version will haben alle Versionen bis 2015 ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 10. Jan. 2015 09:47 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
|
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 10. Jan. 2015 11:54 <-- editieren / zitieren --> Unities abgeben:
Das wäre einsame Spitze Holger! Den Hinweis hatte ich auch schon im Hinterkopf, aber umständlicher, Projektdatei mit Verweisen in Notepad zu überarbeiten. Den Vorschlag von Ex finde ich ausgereift. Du startest also nicht ein neues Projekt mit dem Wizard, sondern nimmst immerwieder deine Projektvorlage her, verstehe ich es richtig ? [Diese Nachricht wurde von cadplayer am 10. Jan. 2015 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 12. Jan. 2015 09:06 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, das Ganze ist am Anfang einige Arbeit, die sich aber dann auch doppelt und dreifach auszahlt. Ich selber habe mehrere Varianten für gut befunden, umgesetzt und nach einiger Zeit wieder verworfen. Allerdings muss man da dann auch dazu sagen, dass ich ja bekanntlich viele verschiedene Tools für diverse Kunden programmiere, wo es dann doch einiges zu beachten gilt, damit ältere Programme nicht mit neuen Programmen kollidieren usw. ... . Das ist für dich wohl eher uninteressant. Zur Vorgehensweise: richte dir ein Projekt in der niedrigsten AutoCAD-Version vollständig ein. Dann kopiere die *.csproj Datei und füge dieses Projekt ebenso deiner Projektmappe hinzu. In diesem Projekt änderst du dann das Framework, schmeißt die älteren AutoCAD-Verweise raus und fügst die der für dieses Projekt vorgesehenen AutoCAD-Version hinzu. Ist das für alle AutoCAD-Versionen geschehen, kannst du dir diese Projektmappe immer wieder kopieren. in den Projekten der kopierten Mappe genügt es nun den Assembly-Namen zu ändern. Ich ändere auch immer noch dem Namespace und ziehe diese Änderung mittels Suchen/Ersetzen in den Projektdateien nach. Das Vorgehen ist nicht wie in Lisp, aber in 5min hat man ein Projekt für alle AutoCAD-Versionen erstellt. Das ganze ist nicht in Schriftform so leicht zu erklären .. weshalb ich für das Thema Code-Organisation in meinen Schulungen immer einen halben Tag vorsehe.
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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 12. Jan. 2015 12:52 <-- editieren / zitieren --> Unities abgeben:
Hi Holger! Vielen Dank für deine Ausführungen - sehr wohl ist das absolut interessant für mich. Werde ich demnächst mal ausprobieren. Eine Frage nur zum Kompiliervorgang, da werden doch die einzelnen dll-Bibliotheken geladen. Muss denn dazu jede Autocad Version installiert sein? Im Prinzip nicht, weil es doch immerwieder die gleichnamigen sind oder ? ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 12. Jan. 2015 13:01 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... man benötigt imgrunde nicht mal ein einziges AutoCAD um für AutoCAD zu programmieren. Es genügen die DLL's in irgendeinem Verzeichnis. Da bei uns in der Firma auch nicht alle Rechner gleich installiert sind, haben wir ein extra Verzeichnis auf der lokalen Platte, in dem sich (sortiert) die AutoCAD-Programmbibliotheken befinden. So kann jeder ein Projekt öffnen und darin weiter arbeiten, ohne dass dann erst die Verweise angepasst werden müssen. 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 |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 12. Jan. 2015 13:09 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
... noch eine Ergänzung: Da die Objekte in den AutoCAD-Versionen (im Regelfall) unverändert sind, egal in welche Bibliothek Autodesk die Definitionen gepackt hat, ist es theoretisch so, dass der reine Code der für 2008 geschrieben wurde auch in 2015 läuft. Das gilt natürlich auch anders herum, sofern man nur Eigenschaften und Methoden verwandt hat, die in den früheren Versionen bereits implementiert waren. Da sich die Verweise erst in der Version 2013 geändert haben, sollten Programme die für 2008 programmiert waren auch in den Versionen 2009-2012 laufen. Wenn dem nicht so ist, dann hat der Programmierer bewusst eingebaut oder der Programmierer hat auf Eigenschaften und Methoden zurückgegriffen, die in den Vorgängerversionen nicht existierten. Ähnlich verhält sich das mit den Programmen ab Version 2013 - die sollten auch in 2014-2015 laufen. Sofern du also ausschließlich in der Versions-Range bis 2012 oder jünger als 2012 arbeitest, musst du gar nicht für die jeweiligen AutoCAD-Versionen eine Kompilierung durchführen. 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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 03. Feb. 2015 08:25 <-- editieren / zitieren --> Unities abgeben:
Jetzt habe ich mal begonnen, mich der Sache anzunehmen. Zunächt wollt ich einmal testen, ob ich das Programm kompilieren (debugen) kann, ohne einen Programmstart von Acad zu starten. Das heisst, die verwendeten dll´s sind als Referenz gebunden. Dennoch bekomme ich folgende Fehlermeldung ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 03. Feb. 2015 11:42 <-- editieren / zitieren --> Unities abgeben:
Ohne Acadstart funktioniert einfach, indem man Shift+F6 drückt. Damit baut es die Applikation ohne Programmstart in Acad. Ich möchte gern eine Message anfügen, sobald das Programm mit netload geladen wird, soll kurz wiedergegeben werden, was mit dem Programm passiert und wie der Eingabebefehl lautet. Sollte man dazu ein script-Item beilegen mit Inhalt bspw. (princ "\nDiese Funktion ermöglicht das Ändern des Linientypes \n*** starte mit SLT") ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2015 09:25 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: Jetzt habe ich mal begonnen, mich der Sache anzunehmen. Zunächt wollt ich einmal testen, ob ich das Programm kompilieren (debugen) kann, ohne einen Programmstart von Acad zu starten. Das heisst, die verwendeten dll´s sind als Referenz gebunden. Dennoch bekomme ich folgende Fehlermeldung
... wenn du debuggen möchtest, must du vom VS aus AutoCAD starten (die 2. Option in deinem ersten Screenshot). Im AutoCAD musst du dann die erstellte DLL mittels NETLOAD laden. Dann funktioniert das Debuggen. 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 |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2015 09:30 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Zitat: Original erstellt von cadplayer: Ohne Acadstart funktioniert einfach, indem man Shift+F6 drückt. Damit baut es die Applikation ohne Programmstart in Acad. Ich möchte gern eine Message anfügen, sobald das Programm mit netload geladen wird, soll kurz wiedergegeben werden, was mit dem Programm passiert und wie der Eingabebefehl lautet. Sollte man dazu ein script-Item beilegen mit Inhalt bspw. (princ "\nDiese Funktion ermöglicht das Ändern des Linientypes \n*** starte mit SLT")
... Script einbinden ist unnötig. Erstelle eine Klasse, die von IExtensionApplication erbt und erstelle darin die Funktion: Initialize und Terminate, die Initialize wird dann beim Laden automatisch ausgeführt, die Terminate beim Beenden von AutoCAD. Code:
public class mInitialize : Autodesk.AutoCAD.Runtime.IExtensionApplication { public void Initialize() { Document _doc = Autodesk.AutoCAD.ApplicationServices.Application.DocumentManager.MdiActiveDocument; Editor _ed = _doc.Editor; _ed.WriteMessage("\nApplication load");} public void Terminate() { } }
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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 09. Feb. 2015 12:05 <-- editieren / zitieren --> Unities abgeben:
|
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 09. Feb. 2015 12:17 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
meine Suche nach AutoCAD Net API documentation bringt mehr als ein Ergebnis - unter anderem auch die Doku von Autodesk. Grüße! Holger PS: Wann kann ich dich bei mir zur Schulung erwarten? ;-) ------------------ 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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 09. Feb. 2015 13:28 <-- editieren / zitieren --> Unities abgeben:
War schon 3 Jahre nicht mehr in Dt. - ich hoffe das wird mal was. Lass mich nur noch ein wenig mit .NET testen, damit ich für dich gewappnet bin. ------------------ Gruss Dirk http://cadplayerlounge.blogspot.se Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009 Windows 10 64bit system Autocad Civil3d 2020 ENGLISH Visual Studio 2019 OpenDCL.Runtime.9<P>
|
erstellt am: 21. Mai. 2015 14:08 <-- editieren / zitieren --> Unities abgeben:
Nochmal nachgefragt. Wenn man zu verschiedenen Acadversionen kompiliert reicht es da nicht einfach, den Debug in die entspr. Acadversion abzuändern? Properties -> Debug -> Start external program -> C:\Program Files\Autodesk\AutoCAD 2015\acad.exe oder Properties -> Debug -> Start external program -> C:\Program Files\Autodesk\AutoCAD 2014\acad.exe Die Refenzen AcCoreMgd, AcDbMgd, AcMgd, AeccBaseMgrd, AeccDbMgd müssten sich doch ebenso mit der Weiterentwicklung ändern oder ? Jedenfalls ging es bei mir, dass ich mein Programm ursprünglich für Civil3d-2014 generiert ohne Austausch der Refernenzen, wie gesagt nur die 2015 acad.exe kompilieren liess. Gibt es da unter Umständen Probleme? ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 21. Mai. 2015 14:19 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, die Acad-DLL's werden ja nur referenziert und nicht in deinem Code fest eingebunden. Da dies ohne Angabe einer spezifischen Version erfolgt, funktionieren die Programm-DLLs auf all den AutoCAD-Versionen, in denen die verwendeten Objekte, deren Eigenschaften, deren Methoden (mit den gleichen Parametern) enthalten sind. Da AutoDesk die API jedoch immer mal wieder neu strukturiert und/oder die Objekteigenschaften oder Methodenaufrufe ändert, kann das Funktionieren eben nicht für alle Ewigkeit garantiert werden. Ich habe die Erfahrung gemacht, dass die für AutoCAD 2008 erstellten Programme nahezu Ausnahmslos bis AutoCAD 2012 laufen. Ab der 2013er kann ich keine Aussage mehr treffen, da ich dann meine Projektstruktur wie oben beschrieben geändert habe. Fazit: Versuch macht klug. 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 |
cadplayer Ehrenmitglied CADniker
Beiträge: 1832 Registriert: 28.04.2009
|
erstellt am: 22. Mai. 2015 07:56 <-- editieren / zitieren --> Unities abgeben:
Danke Holger! Da muss ich mich vorerst mit der Variante begnügen, wobei ich deine im Screenshot, ausgereifter finde. Das mit der Debug-konstante ist mir so noch nicht untergekommen und da bin ich mir unsicher, was da erreicht werden kann. Tust du quasi alle Versions.dlls gleichzeitig erzeugen bzw lädst du immer alle Acad-dlls von allen Versionen in ein Visual-Projekt? ------------------ Gruss Dirk Blog | Adolf Spende | Infra-Feed | ÅF AB
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Brischke Moderator CAD on demand GmbH
Beiträge: 4171 Registriert: 17.05.2001 AutoCAD 20XX, defun-tools
|
erstellt am: 22. Mai. 2015 08:56 <-- editieren / zitieren --> Unities abgeben: Nur für cadplayer
Hallo Dirk, du hast ja eine Projektmappe. In dieser ist eins / sind mehrere Projekte. Wenn du also ein Projekt (z.Bsp. für AutoCAD 2014) fertig hast, gehst du in den Explorer, kopierst die *.csproj-Datei, gibst der einen neuen Namen und fügst dieses Projekt deiner Projektmappe hinzu. In diesem Projekt löschst du die Verweise auf AutoCAD 2014 und fügst die Verweise für AutoCAD 2015 hinzu. Da beide Projekte auf die gleichen Dateien verweisen, sind Änderungen in einem Projekt gleichermaßen im anderen wirksam. Zur bedingten Kompilierung: Beispiel. Bis AutoCAD 2015 war die WcMatch-Funktion in den Utils. Ab 2016 ist die selbe Funktion jedoch in den CoreUtils enthalten. Da ich keine Lust und es zudem auch nicht notwendig ist, erstelle ich keine komplett neuen Funktionen, in denen das WcMatch verwendet wird, sondern arbeite mit bedingten Kompilieranweisungen. Diese bedeuten nichts anderes, als dass die auf die bedingten Anweisungen verweisenden CodeZeilen mit kompiliert werden oder eben auch nicht. #if AC2016 bool _match = Autodesk.AutoCAD.Internal.CoreUtils.WcMatch(_adef.Tag, _AttNamePattern); #else bool _match = Autodesk.AutoCAD.Internal.Utils.WcMatch(_adef.Tag,_AttNamePattern)) #endif Bei mir gibt es die Konstante nur für AutoCAD 2016 und heißt AC2016 - in den anderen Versionen gibt es keine Konstante, so dass die else-Anweisung greift. Soweit klar? (Wenn man es einmal verstanden hat, ist das ein super einfacher Weg, die Versionsunterschiede in den Griff zu bekommen) Grüße! Holger PS: In einer Schulung bei uns ist dieses Thema - CodeHandling && (Objektorientierte-) Code-Bibliotheken in der AutoCAD-Programmierung mit ca. einem Tag angesetzt. Wir waren da ja schon einmal in Kontakt ... ------------------ 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 |