Vous êtes sur la page 1sur 9

Expriences .

Net octobre 2012


Passer DotNet pour la programmation dAutocad pose plusieurs problmes :
- Pour ceux qui viennent du lisp : se familiariser avec des langages modernes , sembter
avec le typage et la porte des variables et des fonctions
-

Pour ceux qui viennent du lisp comme du VBA : programmer avec un diteur
compltement externe Autocad.
Ce dernier point entraine pas mal de complications et de lourdeurs, pour les tests, le
dbogage, et laccs la documentation.
Cet article est une rponse de dbutant pour les dbutants quelques points prcis, et ne
donne des exemples quen VB
Expriences .Net octobre 2012
Par o commencer avec .net?
Ou trouver de l'aide sur les classes et le modle dobjet ?
Dans Visual Studio
Autres sources de documentation
Dans le rpertoire du SDK : Contenu de C:\ObjectARX 2012\docs :
Aide pour la programmation de Map
Aide pour la programmation de Civil
Aide pour la programmation avec Com (Visual basic, Visual lisp)
Migration de projet VBA
Comparaison manag-non manag
Non manag :
Manag :
Pourquoi mes points d'arrt ne fonctionnent pas ?
Glossaire :
Liens divers et utiles :

Par o commencer avec .net?


Pour les dbutants francophones comme moi, Gile a t source d'aide prcieuse, je pense qu'il est
prfrable de commencer crer son wizard personnalis avec ses tutos
Au dbut, je me suis mis pied d'uvre avec celui ci
Je vous laisse le soin de consulter ces articles, car mon billet nest pas destin cloner ce qui a
dj t fait, mais mettre laccent sur le problme de la documentation, et sur quelques point et
concepts qui mont pos problme car je suis de la vieille cole, alors que les dveloppeurs
habitus aux langages modernes ne les remarquent pas

Ou trouver de l'aide sur les classes et le modle dobjet ?


Dans Visual Studio
Pour les fonctions VB et les librairies Microsoft, l'explorateur d'objet de Visual Studio donne
directement des explications.

Pour toutes les librairies Autocad, il n'y a rien, sauf les mots clefs, les types, etc.
Pour avoir l'aide du SDK Autocad avec Visual studio, il faut installer l'aide pour Visual studio :
Tlcharger ObjectARX 2012 Documentation sur la page ADN et l'installer d'abord sous Windows,
puis sous Visual Studio :
- Ouvrir le gestionnaire d'aide
- Installer du contenu partir du disque
- Parcourir... -> C:\Program Files (x86)\Autodesk\ObjectARX 201x Help Files - Visual Studio 2010
Integration\helpcontentsetup.msha
- Suivant
- ObjectARX (Native & Managed) AutoCAD 201x -> Ajouter
Mais ce n'est pas forcment vident, il y a quelques problmes voir Ici

Autres sources de documentation


La bible : AutoCAD 2012 .NET Developers Guide
Il est consulter en 1er pour tout ce qui est commun Autocad

Dans le rpertoire du SDK : Contenu de C:\ObjectARX 2012\docs :


arxdoc.chm :
Contient tous les autres :

arxdev.chm
ObjectARX Introductory Concepts, un genre de arx developper guide ressemble celui du lisp

arxiop.chm
ObjectARX for AutoCAD 2012 : Application Interoperability Guidelines
Des explications sur les conventions de noms, d'interface, d'installation, un guide de
bonne pratique.

arxmgd.chm
ObjectARX for AutoCAD 2011 : Managed Class Reference
The Managed Class library provides namespaces which wrap the ObjectARX C++ library. This
permits developers to program in the .NET environment.

L'quivalent de l'aide active X pour .net : toutes les classes, les mthodes et les
proprits.
Par exemple, pour les entits graphiques:
Autodesk.AutoCAD.DatabaseServices.Entity
This .NET class wraps the AcDbEntity ObjectARX class. It is the base class for
all database objects having a graphical representation.

Exemple : 3dsolid
Autodesk.AutoCAD.DatabaseServices.DBObject
Autodesk.AutoCAD.DatabaseServices.Entity
Autodesk.AutoCAD.DatabaseServices.Solid3d

Manag,
est quivalent :
AcRxObject
AcGiDrawable
AcHeapOperators
AcDbObject
AcDbEntity
AcDb3dSolid

Non Manag.

Comparatif des mthodes :

Managed methods
BooleanOperation
ChamferEdges
CheckInterference
CleanBody
ConvertToBrepAtSubentPaths
CopyEdge
CopyFace
CreateBox
CreateExtrudedSolid
CreateFrustum
CreateLoftedSolid
CreatePyramid
CreateRevolvedSolid
CreateSculptedSolid
CreateSphere
CreateSweptSolid

Arx methods
body
booleanOper
chamferEdges
checkInterference
cleanBody
convertToBrepAtSubentPaths
copyEdge
copyFace
createBox
createExtrudedSolid
createFrom
createFrustum
createLoftedSolid
createPyramid
createRevolvedSolid
createSculptedSolid
createSphere
createSweptSolid

CreateTorus
CreateWedge
Extrude
ExtrudeAlongPath
ExtrudeFaces
ExtrudeFacesAlongPath
FilletEdges

GetSection
GetSubentityColor
GetSubentityMaterial
GetSubentityMaterialMapper
ImprintEntity

OffsetBody
OffsetFaces
ProjectOnToSolid
RemoveFaces
Revolve
SeparateBody

SetSubentityColor
SetSubentityMaterial
SetSubentityMaterialMapper
ShellBody

createTorus
createWedge
enableObjectChangeGuid
extrude
extrudeAlongPath
extrudeFaces
extrudeFacesAlongPath
filletEdges
generateDifferentObjectChangeGuid
getArea
getMassProp
getObjectChangeGuid
getSection
getSlice
getSubentColor
getSubentMaterial
getSubentMaterialMapper
imprintEntity
internalSubentId
internalSubentPtr
isNull
isObjectChangeGuidEnabled
numChanges
offsetBody
offsetFaces
projectOnToSolid
recordHistory
removeFaces
revolve
separateBody
setBody
setRecordHistory
setShowHistory
setSubentColor
setSubentMaterial
setSubentMaterialMapper
shellBody
showHistory

Slice
StlOut

stlOut
subGetClassID
TaperFaces
taperFaces
TransformFaces
transformFaces
On voit que toutes les mthodes arx n'existent pas en manag, et qu'une seule mthode existe en
manag mais pas en arx : Slice

arxmgr.chm
ObjectARX 64-Bit Migration Guide

.Net tant manag, pas besoin de le lire

arxref.chm
ObjectARX for AutoCAD Ironman : Reference Guide
Documents the ObjectARX and RealDWG C++ classes, member functions, global
functions, namespaces, enumerations, structures, and macros.
Voir le comparatif ci dessus avec arxmgd.chm
Contient toutes les classes, les mthodes et les proprits en non manag

readarx.chm
ObjectARX for AutoCAD 2012: Readme
Describes changes and additions to this release of ObjectARX.

Aide pour la programmation de Map


Pas trouve avec civil 2012, mais prsente dans civil 2011, dans le rpertoire :
C:\Program Files\Autodesk\AutoCAD Civil 3D 2011\Help
sdk.arx.cpp.dev.chm
sdk.arx.cpp.dev.pdf
AutoCAD Map 3D ObjectARX C++ Reference
sdk.arx.cpp.ref.chm
sdk.arx.net.dev.chm
AutoCAD Map 3D ObjectARX .NET Developer's Guide
sdk.arx.net.dev.pdf
AutoCAD Map 3D ObjectARX .NET Reference
sdk.arx.net.ref.chm
sdk.samples.chm
AutoCAD Map 3D Developer Samples Guide
sdk.samples.pdf
AutoCAD Map 3D SDK Readme
sdk._readme.chm
sdk.geo.dev.chm
Autodesk Geospatial Platform Developer's Guide
sdk.geo.dev.pdf
Autodesk Geospatial Platform Reference
sdk.geo.ref.chm
sdk.geo.ref.acmap.ch
Autodesk Geospatial Platform AutoCAD Map 3D Extensions Reference
m
AutoCAD Map 3D ObjectARX C++ Developer's Guide

Aide pour la programmation de Civil


Pas trouve avec civil 2012, mais prsente dans civil 2011, dans le rpertoire :
C:\Program Files\Autodesk\AutoCAD Civil 3D 2011\Help
ActiveX API Reference (civilauto-reference.chm): contient mme
l'object model
Civil 3D Developer's Guide

civil_api_activex_reference.chm
civil_api_developers_guide.chm

CustomDraw C++ API Reference


.NET API Reference

civil_api_draw_reference.chm
civil_api_net_reference.chm

Aide pour la programmation avec Com (Visual basic, Visual lisp)


Disparue depuis la version 2011, inaccessible en ligne depuis VisualLisp, elle est rapparue pour
Autocad 2013 :
ActiveX API documentation
Elle vous sera utile pour le portage de programme VBA en .net, qui est indispensable si vous
travaillez en X64.

Migration de projet VBA


Cest possible avec trs peu de modifications, except pour les vnements qui ne sont pas du
tout compatibles.
Pour pouvoir utiliser com, il faut rfrencer et importer interrop :
Rfrencer C:\ObjectARX 201x\inc [..]\Autodesk.AutoCAD.Interop.dll et Interop.Common.dll
Imports Autodesk.AutoCAD.Interop
Imports Autodesk.AutoCAD.Interop.Common

Un petit lien utile :


10 steps to migrate existing code to VB.NET

Comparaison manag-non manag


Pour rellement comprendre la diffrence entre les deux documentations arxmgd.chm et

arxref.chm
L'exemple que je connais bien : acedInvoke() / invoke () qui a t l'objet de ce sujet : Liaison
LISP/.NET

Non manag :
Import de acedInvoke
<System.Security.SuppressUnmanagedCodeSecurity()> _
<DllImport("acad.exe", EntryPoint:="acedInvoke", _
CharSet:=CharSet.Unicode, CallingConvention:=CallingConvention.Cdecl)> _
Private Shared Function acedInvoke(ByVal args As IntPtr, ByRef result As IntPtr) As
Integer
End Function

On note : acedInvoke retourne un integer, ncessite deux arguments :


args pour ce que l'on voque, et result pour le rsultat
les arguments sont de type IntPtr :
Type spcifique la plateforme, utilis pour reprsenter un pointeur ou un handle.
En gros, acedInvoke retourne non pas un resultbuffer, mais l'adresse du resultbuffer

Puis on dfinit La fonction InvokeLisp qui appelle acedInvoke


Public Shared Function InvokeLisp(ByVal args As ResultBuffer) As ResultBuffer
Dim ip As IntPtr = IntPtr.Zero
Dim status As Integer = acedInvoke(args.UnmanagedObject, ip)
If status = CInt(PromptStatus.OK) AndAlso ip <> IntPtr.Zero Then
Return ResultBuffer.Create(ip, True)
End If
Return Nothing
End Function

On note : InvokeLisp accepte un argument resultbuffer, et retourne un resultbuffer.


On initialise ip avec l'adresse 0
On passe a acedinvoke le resultbuffer sous forme de intPtr, car la proprit UnmanagedObject
est Public ReadOnly Property UnmanagedObject As System.IntPtr
Membre de Autodesk.AutoCAD.Runtime.DisposableWrapper

Le rsultat est pass par IP, qui est un IntPtr, et qui est transform en resultbuffer par la methode
create : ResultBuffer.Create(ip, True)
'ResultBuffer.Create
'This method creates a managed ResultBuffer object from an unmanaged resbuf pointer.
Exemple d'utilisation :
' call the 'foo' Lisp function which binds the reversed list to 'lst2'
' (defun foo () (setq lst2 (reverse lst1))) (vl-acad-defun 'foo)
AcadExtensions.LispExtensions.InvokeLisp(New ResultBuffer(New
TypedValue(CInt(LispDataType.Text), "foo")))

Manag :
Pas besoin d'import, on a une seule fonction :
Public Shared Function InvokeLispManaged(ByVal args As ResultBuffer) As ResultBuffer
Return Autodesk.AutoCAD.ApplicationServices.Application.Invoke(args)
End Function
Exemple d'utilisation :
' (defun foo () (setq lst2 (reverse lst1))) (vl-acad-defun 'foo)
'Appel lisp en manag:
retour = AcadExtensions.LispExtensions.InvokeLispManaged(New ResultBuffer(New
TypedValue(CInt(LispDataType.Text), "foo")))

Le code manag est donc plus simple, il faut d'abord chercher dans

arxmgd.chm

Pourquoi mes points d'arrt ne fonctionnent pas ?


Les points d'arrt system (windows) et Autocad de base marchent trs bien. Il semble que ceux de
civil ou Map ne marchent pas.
Quand on est dans ce cas, on peut tracer avec des instructions de ce genre :
MsgBox("Je suis dans ma boucle

" + Chr(iObjCnt))

Glossaire :
Beaucoup de mots anglais nont t rencontrs que dans le contexte informatique. Il peut tre
intressant de connatre leur sens gnral :
En voici quelques un issus dun dico harraps, mais cette liste a vocation sagrandir
Class : leon, cours
Inherit : hriter
Overrule : Rejeter (jaurais jur passer par-dessus la rgle )
Override : Annuler, passer outre, prdominer
Void : Vide, nul, non valide
Wrap : Envelopper

Dumpbin :
Ouvrir en mode administrateur le rpertoire :
C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin
Exemple dusage :
dumpbin /headers C:\Windows\System32\*.dll
ou
dumpbin.exe /EXPORTS acad.exe > acad.txt

Liens divers et utiles :


ProgrammationCsharp.pdf
Livre c#
Drive AutoCAD with Code
Blog c# plein de supers exemples
CIVIL .Net (Infrastructure Modeling DevBlog)
Programmer Civil avec .net
Convert VB.NET to C# - A free code conversion tool - developer Fusion
Code Converter | Provided by Telerik
Vous aurez souvent le faire
through-the-interface. AutoCAD .NET
Vous laurez dj trouv !

g-eaux

Vous aimerez peut-être aussi