samideqlqpart Posté(e) le 11 novembre 2017 Posté(e) le 11 novembre 2017 Bonjour A titre d'exemple pour commencer mon apprentissage sur c#j'ai repris le code pour le tracage de polyline sur "AutoCad .Net developers guide"AddLightweightPolyline 1.Seulement ne génère pas de DLL pour etre appelé par Netload?2.A l'execution du code j'ai ce qui suit:Error 1 Program 'c:\Users\home\Documents\Visual Studio 2013\Projects\lightpoly\lightpoly\obj\Debug\lightpoly.exe' does not contain a static 'Main' method suitable for an entry point C:\Users\home\Documents\Visual Studio 2013\Projects\lightpoly\lightpoly\CSC lightpoly à moins que j'ajoute pour que l'erreur disparaisse static void Main(string[] args) { } Voici le code, est ce que c'est une ecriture juste? using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Autodesk.AutoCAD.Runtime; using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; namespace lightpoly { class Program { static void Main(string[] args) { } [CommandMethod("AddLightweightPolyline")] public static void AddLightweightPolyline() { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // Start a transaction using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record Model space for write BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[blockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Create a polyline with two segments (3 points) Polyline acPoly = new Polyline(); acPoly.SetDatabaseDefaults(); acPoly.AddVertexAt(0, new Point2d(2, 4), 0, 0, 0); acPoly.AddVertexAt(1, new Point2d(4, 2), 0, 0, 0); acPoly.AddVertexAt(2, new Point2d(6, 4), 0, 0, 0); // Add the new object to the block table record and the transaction acBlkTblRec.AppendEntity(acPoly); acTrans.AddNewlyCreatedDBObject(acPoly, true); // Save the new object to the database acTrans.Commit(); } } } }
(gile) Posté(e) le 11 novembre 2017 Posté(e) le 11 novembre 2017 Salut, Le projet d'un plugin AutoCAD (voué à être chargé avec NETLOAD) doit être un projet de type "Bibliothèque de classe".Ceci n'est pas spécifique à C#, c'est valable pour tout projet .NET quel que soit le langage (C#, C++/CLI, F#, VB, etc). Tu peux voir ce screencast fait pour AutoCAD 2015 avec Visual Studio 2015, mais très facilement transposable à d'autres versions d'AutoCAD et/ou de Visual Studio. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 11 novembre 2017 Posté(e) le 11 novembre 2017 La suite, ou comment créer un modèle de projet (Template) à partir du projet précédemment créé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
samideqlqpart Posté(e) le 11 novembre 2017 Auteur Posté(e) le 11 novembre 2017 Very big erreur de ma part mercije suis parti de consoleApplication au lieu de classlibrary using Autodesk.AutoCAD.Runtime;using Autodesk.AutoCAD.ApplicationServices;using Autodesk.AutoCAD.DatabaseServices;using Autodesk.AutoCAD.Geometry;namespace AddlightPolyline{ public class Class1 { [CommandMethod("AddLightweightPolyline")] public static void AddLightweightPolyline() { // Get the current document and database Document acDoc = Application.DocumentManager.MdiActiveDocument; Database acCurDb = acDoc.Database; // Start a transaction using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { // Open the Block table for read BlockTable acBlkTbl; acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable; // Open the Block table record Model space for write BlockTableRecord acBlkTblRec; acBlkTblRec = acTrans.GetObject(acBlkTbl[blockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; // Create a polyline with two segments (3 points) Polyline acPoly = new Polyline(); acPoly.SetDatabaseDefaults(); acPoly.AddVertexAt(0, new Point2d(2, 4), 0, 0, 0); acPoly.AddVertexAt(1, new Point2d(4, 2), 0, 0, 0); acPoly.AddVertexAt(2, new Point2d(6, 4), 0, 0, 0); // Add the new object to the block table record and the transaction acBlkTblRec.AppendEntity(acPoly); acTrans.AddNewlyCreatedDBObject(acPoly, true); // Save the new object to the database acTrans.Commit(); } } } }
samideqlqpart Posté(e) le 12 novembre 2017 Auteur Posté(e) le 12 novembre 2017 Que signifie:[assembly: CommandClass(typeof(AcadUISample.ModalDialog.Commands))]code que j'ai trouvé sur "gileCAD""Les interfaces utilisateur avec AutoCAD .NET"merci
(gile) Posté(e) le 12 novembre 2017 Posté(e) le 12 novembre 2017 L'attribut CommandClass n'est pas obligatoire mais il permet d'optimiser le chargement en indiquant au compilateur les classes du projet qui définissent des commandes. Il faut donc : soit ne pas l'utiliser du tout ; soit le mettre pour toutes les classes du projet qui définissent des commandes (avec l'attribut CommandMethod). C'est la cas dans le tutoriel dont tu parles, toutes les classes qui définissent des commandes (et seulement celles-ci) ont cet attribut. Tu peux voir ce sujet en anglais. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
samideqlqpart Posté(e) le 12 novembre 2017 Auteur Posté(e) le 12 novembre 2017 Toujours sur le même exemplePourquoi avoir ecris// création d'une instance de ModelessDialog var dialog = new ModelessDialog(); et non pas ModelessDialog dialog = new ModelessDialog(); vu qu'il s'agit d'une boite de dialogue? pkoi var
(gile) Posté(e) le 12 novembre 2017 Posté(e) le 12 novembre 2017 Parce que c'est plus court à taper ;)Et aussi parce que : ModelessDialog dialog = new ModelessDialog(); c'est un peu redondant, non ? Il s'agit de ce qu'on appelle : l'inférence de type, le mot clé var permet de pas indiquer explicitement le type et de laisser le soin au compilateur de le faire. La variable dialog est tout de même fortement typée (si tu places ton curseur sur la variable un peu plus loin dans le code, tu verras que Visual Studio sait que le type de dialog est ModelessDialog.Voir cet article. On peut fiare le même genre de chose en VB en activant l'option Infer (encore une option de compilation). Mais encore une fois VB peut rendre le code confus :Dim dialog As ModelessDialog = New ModelessDialog() le type de la variable dialog est ModelessDialog Dim dialog = New ModelessDialog() le type de la variable dialog sera ModelessDialog si Infer = On, mais sera Object si Infer = Off (=> liaison tardive implicite). À mon avis, un langage dont le même code est compilé différemment en fonction d'options de compilation pas toujours visible est à éviter. Le plus strict les langages .NET de première classe (C#, C++/CLI, F#, VB) est F# qui n'accepte aucune conversion implicite (on ne peut pas additionner un nombre entier (int) avec un nombre un réel (float)). Cette rigueur permet que l'inférence de type soit utilisée par défaut.F#let isEven x = x % 2 = 0Aucun type n'est spécifié mais le compilateur déduit que isEven est une fonction qui prend un nombre entier et retourne un booléen (signature : int -> bool). Avec C# ou VB il faut spécifier le type de retour et le type de l'argumentC#bool IsEven(int x) => x % 2 == 0;VBFunction IsEven(ByVal x As Integer) As Boolean Return x Mod 2 = 0 EndFunction Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
samideqlqpart Posté(e) le 12 novembre 2017 Auteur Posté(e) le 12 novembre 2017 1/j'ai compris que la declaration de type implicite var n'est valable que pour les variables locales?2/À mon avis, un langage dont le même code est compilé différemment en fonction d'options de compilation pas toujours visible est à éviter.c'est à dire?
(gile) Posté(e) le 12 novembre 2017 Posté(e) le 12 novembre 2017 Avec la même expression :Dim dialog = New ModelessDialog()Si option Infer = On, le type de dialog est ModelessDialog => liaison précoce (early binding)Si option Infer = Off, le type de dialog est Object => liaison tardive (late binding)Tu as pu constater par toi même les conséquences sur les performances que peut provoquer la liaison tardive. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
samideqlqpart Posté(e) le 14 novembre 2017 Auteur Posté(e) le 14 novembre 2017 Faut il pour une question de gain de temps et d'espace mémoire declarer les variables en locales ou globales C'est à dire que l'espace memoire reservé à la variable "x" n'est crée qu'au moment de l'appel du code par le compilateur ou tout simplement la declarer en globale et l'espace memoire est reservé à cette variable pour tout le projet(même variable x) exemple Local: private void btnR1_Click(object sender, EventArgs e) { int x } private void btnR2_Click(object sender, EventArgs e) { int x } Global: int x private void btnR1_Click(object sender, EventArgs e) { } private void btnR2_Click(object sender, EventArgs e) { }
(gile) Posté(e) le 14 novembre 2017 Posté(e) le 14 novembre 2017 Salut, À mon avis la question de la portée d'une variable ne se pose pas tant en terme d'utilisation de la mémoire qu'en terme de fonctionnement du code. Je ne sais pas ce que tu appelles "variable globale" quand tu dis par ailleurs "tout le projet". Je pense qu'une bonne pratique est de limiter la portée d'une variable au minimum nécessaire :Si la variable est spécifique à une méthode, il faut la déclarer localement dans la méthode.Si la variable doit être accessible pour plusieurs méthodes d'une même classe mais n'a pas besoin d'être visible à l'extérieur de la classe, il faut la déclarer au niveau de la classe en tant que champ privé.Si la variable doit être accessible pour les instances de cette classe, il faut en faire une propriété publique.Si la variable doit être accessible indépendamment des instances de la classe, il faut en faire une propriété publique statique (dans ce cas, il est préférable que la propriété soit en lecture seule). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
samideqlqpart Posté(e) le 15 novembre 2017 Auteur Posté(e) le 15 novembre 2017 salutbref,net et precismerci à+
Messages recommandés
Créer un compte ou se connecter pour commenter
Vous devez être membre afin de pouvoir déposer un commentaire
Créer un compte
Créez un compte sur notre communauté. C’est facile !
Créer un nouveau compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant