CADxp: Code ne génerant pas de DLL - CADxp

Aller au contenu

Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Code ne génerant pas de DLL

#1 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 11 novembre 2017 - 17:30

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:
Error1Program '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 pointC:\Users\home\Documents\Visual Studio 2013\Projects\lightpoly\lightpoly\CSClightpoly


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







0

#2 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 11 novembre 2017 - 18:38

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
Image IPB
0

#3 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 11 novembre 2017 - 18:45

La suite, ou comment créer un modèle de projet (Template) à partir du projet précédemment créé.


Gilles Chanteau - gileCAD -
Développements sur mesure pour AutoCAD
Image IPB
0

#4 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 11 novembre 2017 - 20:41

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


}
0

#5 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 12 novembre 2017 - 13:35

Que signifie:
[assembly: CommandClass(typeof(AcadUISample.ModalDialog.Commands))]

code que j'ai trouvé sur "gileCAD"
"Les interfaces utilisateur avec AutoCAD .NET"

merci



0

#6 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 12 novembre 2017 - 14:52

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
Image IPB
0

#7 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 12 novembre 2017 - 15:34

Toujours sur le même exemple
Pourquoi 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
0

#8 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 12 novembre 2017 - 16:27

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
Image IPB
0

#9 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 12 novembre 2017 - 22:59

1/j'ai compris que la declaration de type implicite var n'est valable que pour les variables locales?
2/

Citation

À 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?




0

#10 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 13 novembre 2017 - 00:40

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
Image IPB
0

#11 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 14 novembre 2017 - 09:29

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

0

#12 L'utilisateur est hors-ligne   (gile) 

  • ceinture rouge et blanche 8em dan
  • Groupe : Moderateurs
  • Messages : 10687
  • Inscrit(e) : 02-septembre 05

Posté 14 novembre 2017 - 10:39

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
Image IPB
0

#13 L'utilisateur est hors-ligne   samideqlqpart 

  • ceinture orange
  • Groupe : Membres
  • Messages : 26
  • Inscrit(e) : 20-septembre 17

Posté 15 novembre 2017 - 09:59

salutbref,net et precis
merci à+
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)