Aller au contenu

Code ne génerant pas de DLL


Messages recommandés

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();
           }
       }
   }
}





 

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

Very big erreur de ma part merci

je 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();

}

}

}

 

 

}

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 = 0

Aucun 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'argument

C#

bool IsEven(int x) => x % 2 == 0;

VB

Function IsEven(ByVal x As Integer) As Boolean
   Return x Mod 2 = 0
EndFunction

Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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)
       {
         
       }

Lien vers le commentaire
Partager sur d’autres sites

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 -
Développements sur mesure pour AutoCAD
ADSK_Expert_Elite_Icon_S_Color_Blk_125.png

Lien vers le commentaire
Partager sur d’autres sites

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité