Aller au contenu

Dessiner Rectangle


Messages recommandés

Salut tout le monde je cherche à dessiner un rectangle avec des points qui sont défini plus tôt dans mon programme.

Cependant je ne sais pas comment envoyer le dessin sur le plan autocad. J'utilise les bibliothèques COM

 

using Autodesk.AutoCAD.Interop;

using Autodesk.AutoCAD.Interop.Common;

 

 

Je récupère la puissance, l'orientation et le nom du layer qui est en fait un évaporateur.

Celui-ci est censé me dessiner un rectangle mais qui n'est jamais tracé.

Du coup après la définition des points comment je fais pour tracer ce Polyline ?

 

 


 public void Trace(int Puissance, string Orientation, string Layer)
   {
     
     try
     {
       object[] objArray = new object[2];
       this.acDoc.ActiveLayer = this.acDoc.Layers.Item((object) Layer);
       new GetPointCoord.GetPointCoord().GetPoint(this.acDoc, ref objArray[0], ref objArray[1]);
       double num1 = this.RecupEchelle(this.acDoc);
       double num2;
       double num3;
       switch (Orientation)
       {
         case "Verticale":
           num2 = num1 * (Math.Log((double) Puissance) / (Math.Log(10.0) * 6.58));
           num3 = num1 * (Math.Log((double) Puissance) / (Math.Log(10.0) * 3.15));
           break;
         case "Horizontale":
           num3 = num1 * (Math.Log((double) Puissance) / (Math.Log(10.0) * 6.58));
           num2 = num1 * (Math.Log((double) Puissance) / (Math.Log(10.0) * 3.15));
           break;
         default:
           num3 = num1 * (Math.Log((double) Puissance) / (Math.Log(10.0) * 6.58));
           num2 = num1 * (Math.Log((double) Puissance) / (Math.Log(10.0) * 3.15));
           break;
       }
       this.acDoc.ModelSpace.AddLightWeightPolyline((object) new double[10]
       {
         (double) objArray[0] - num2 / 2.0,
         (double) objArray[1] + num3 / 2.0,
         (double) objArray[0] + num2 / 2.0,
         (double) objArray[1] + num3 / 2.0,
         (double) objArray[0] + num2 / 2.0,
         (double) objArray[1] - num3 / 2.0,
         (double) objArray[0] - num2 / 2.0,
         (double) objArray[1] - num3 / 2.0,
         (double) objArray[0] - num2 / 2.0,
         (double) objArray[1] + num3 / 2.0
       }).Closed = true;
       acDoc.Application.Update();
     }
     catch (System.Exception ex)
     {
       int num = (int) MessageBox.Show(ex.Message);
     }
       
   }

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

À mon avis, le problème ne vient pas du code que tu as posté qui devrait fonctionner si les arguments qui lui sont passés et les valeurs retournées par les méthodes internes qu'il appelle sont valides.

Je parierais pour num1 = 0.0 (i.e. this.RecupEchelle(this.acDoc) retourne 0.0) ce qui fait que tous les sommets de la polyline seraient en (0, 0).

 

À vérifier en faisant un débogage pas à pas.

 

J'ai testé en remplaçant ces appels par des valeurs valides et ça fonctionne sans problème.

 

        public void Trace(int Puissance, string Orientation, string Layer)
       {
           try
           {
               //object[] objArray = new object[2]
               this.acDoc.ActiveLayer = this.acDoc.Layers.Item((object)Layer);
               object[] objArray = new object[2] { 20.0, 20.0 }; //new GetPointCoord.GetPointCoord().GetPoint(this.acDoc, ref objArray[0], ref objArray[1]);
               double num1 = 1.0; //double num1 =  this.RecupEchelle(this.acDoc);
               double num2;
               double num3;
               switch (Orientation)
               {
                   case "Verticale":
                       num2 = num1 * (Math.Log((double)Puissance) / (Math.Log(10.0) * 6.58));
                       num3 = num1 * (Math.Log((double)Puissance) / (Math.Log(10.0) * 3.15));
                       break;
                   case "Horizontale":
                       num3 = num1 * (Math.Log((double)Puissance) / (Math.Log(10.0) * 6.58));
                       num2 = num1 * (Math.Log((double)Puissance) / (Math.Log(10.0) * 3.15));
                       break;
                   default:
                       num3 = num1 * (Math.Log((double)Puissance) / (Math.Log(10.0) * 6.58));
                       num2 = num1 * (Math.Log((double)Puissance) / (Math.Log(10.0) * 3.15));
                       break;
               }
               this.acDoc.ModelSpace.AddLightWeightPolyline((object) new double[10]
               {
                 (double) objArray[0] - num2 / 2.0,
                 (double) objArray[1] + num3 / 2.0,
                 (double) objArray[0] + num2 / 2.0,
                 (double) objArray[1] + num3 / 2.0,
                 (double) objArray[0] + num2 / 2.0,
                 (double) objArray[1] - num3 / 2.0,
                 (double) objArray[0] - num2 / 2.0,
                 (double) objArray[1] - num3 / 2.0,
                 (double) objArray[0] - num2 / 2.0,
                 (double) objArray[1] + num3 / 2.0
               }).Closed = true;
               acDoc.Application.Update();
           }
           catch (System.Exception ex)
           {
               int num = (int)MessageBox.Show(ex.Message);
           }
       }

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Daccord merci pour cet indice.J'ai vérifié la méthode RecupEchelle() et je vois en effet que ça retourne

XDataValue[1]=0.0

public double RecupEchelle(AcadDocument doc)
   {
     object XDataType = new object();
     object XDataValue = new object();
     object[] objArray = new object[2];
     doc.Layers.Item((object) "JFC_EVAPORATEUR").GetXData("", out XDataType, out XDataValue);
     return Convert.ToDouble(((object[]) XDataValue)[1]);
   }

J'ai ce code mais je ne sais pas trop comment il marche. Ca n'aarête pas de tourner en boucle et ça ne dessine rien finalement alors que je vois vois bien DrawRectangle()

Et avec ça il y a un timer dont je ne connais pas trop le role dans ce code.

 

protected override void OnPaint(PaintEventArgs pe)
   {
       using (TextureBrush textureBrush = new TextureBrush((System.Drawing.Image) this.bmp))
       {
         pe.Graphics.TranslateTransform((float) -this.offset, 0.0f);
         pe.Graphics.FillRectangle((Brush) textureBrush, 0.0f, 1f, (float) this.val / (float) this.max * (float) (this.Width - 2) + (float) this.offset, 14f);
       }
     
     pe.Graphics.Transform = new Matrix();
     pe.Graphics.DrawRectangle(new Pen(this.borderColor), this.myClientRectangle);
     
   }

private void timer_Tick(object sender, EventArgs e)
   {
     this.offset += this.step;
     this.Invalidate();
     if (this.offset != this.bmp.Width)
       return;
     this.offset = 0;
   }

Lien vers le commentaire
Partager sur d’autres sites

Tes demandes sont vraiment très difficilement compréhensibles.

 

Tu donnes d'abord un bout de code qui appelle deux fonctions dont on doit deviner ce qu'elle font et dont il faut déduire qu'une d'elle au moins est susceptible de retourner une valeur invalide (il faudrait gérer cette situation).

 

Puis, du coq à l'âne, tu parles de deux autres méthodes qui ont peut-être un rapport entre elles, mais n'en ont aucun avec le problème précédent...

 

Le problème avec les codes que tu postes est qu'ils utilisent les champs d'une classe (this.xxxx) mais qu'on ne sait rien de cette classe ni même s'il s'agit toujours de la même.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Excuse moi mais il est vrai que je ne m'y connais pas en liaison Autocad lié avec du C# alors, merci d'être patient avec moi. Je ne suis pas un adepte.

En fait à la base mon but est de mettre à jour une application c# qui a été développé par un autre que moi et qui n'a pas du tout laissé de commentaire dans le code. Et comme je ne suis pas un génie, je tante tant bien que mal de résoudre le problème. Et si je saute du coq à l'âne c'est que je commence à mieux comprendre le code.

Si j'arrive à comprendre ce qui cloche lors de la migration du code vers des systèmes d'exploitation supérieurs. Et si j'arrive à comprendre aussi les différences entre certaines méthodes(procédures et fonctions) de Autocad 2010 et 2016 alors mon problème sera certainement résolu.

 

J'ai fini par trouver une version de base du code qui marche mais seulement sous Windows vista je ne sais pas pourquoi.

Lorsque je migre le code sur Windows 7 ou 10 ça m'affiche cette erreur, sachant qu'a la place de cette erreur c'est une input box qui doit être affichée.

post-63390-0-70258100-1454058421_thumb.png

Et voici le code lié.


public double inputbox()
   {
     InputBox inputBox = new InputBox(this.acApp);
     this.BringToFront();
     while (inputBox.ShowDialog() != DialogResult.OK)
     {
       int num = (int) MessageBox.Show("Veuillez saisir une valeur");
     }
     return Convert.ToDouble(inputBox.TxtEchelle.Text);
   }

Sachant que sur Windows vista cette erreur ne s'affiche pas.

 

Et voici normalement ce qui doit s'afficher(et qui s'affiche sous Windows 10)

post-63390-0-58144600-1454059123_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

je te conseille d'utiliser le mode débogage de Visual Studio avec une exécution pas à pas. Ainsi tu va pouvoir analyser ligne après ligne tout le programme et valider chaque variable/fonction/méthode.

 

Ca prend du temps mais ça va te permettre de comprendre tout le fonctionnement. Dès qu'une fonction plante, relance ton prog avec un point d'arrêt dans ta fonction et analyse-la.

 

Tu peux également utiliser des try/catch pour analyser les boucles et ainsi vérifier les exception lors de cas particuliers.

 

;)

  • Upvote 1

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Encore une fois, il manque des informations.

Le code utilise un constructeur pour la classe InputBox qui requiert un argument : this.acApp (dont on ne peut que supposer qu'il s'agit d'un objet AcadApplication) et on ne sait pas comment est utilisé ce paramètre...

  • Upvote 1

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Merci les gars j'ai bien commencé à débogger pas à pas et je suis entrain de mieux comprendre le fonctionnement du code.

Alors il y a une erreur que je ne comprends pas trop.

C'est une erreur due à la l'instanciation de couleur.

 


AcadAcCmColor acadAcCmColor = new AcadAcCmColor();
                   acadAcCmColor = this.acDoc.Application.GetInterfaceObject("AutoCAD.AcCmColor.20");

 

Il m'affiche ceci:

post-63390-0-04255600-1454276213_thumb.png

Lien vers le commentaire
Partager sur d’autres sites

En fait chaque fois que le programme arrive à ce niveau il se produit une erreur certainement due au timing du programme .

Je n'arrive jamais a rentrer dans ce if:

 

               AcadAcCmColor acadAcCmColor = this.acDoc.Application.GetInterfaceObject("AutoCAD.AcCmColor.20");


 if (!flag1)
       {
          //Si flag1 est false alors on crée un calque JFC_EVAPORATEUR
          acadAcCmColor.SetRGB(0, byte.MaxValue, 0);
         acDoc.Layers.Add("JFC_EVAPORATEUR");
         acDoc.Layers.Add("JFC_EVAPORATEUR").TrueColor = acadAcCmColor;
         short[] numArray = new short[2];
         object[] objArray = new object[2];
         numArray[0] = 1001;//Défini le nom du projet ou plutôt de l'application qui est ici JFC_Traceur
         objArray[0] = "JFC_TRACEUR";
         numArray[1] = 1071;
         objArray[1] = 0;
         acDoc.Layers.Item( "JFC_EVAPORATEUR").SetXData( numArray, objArray);
       }

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Avec juste ce code, ca va etre dur de t'aider.

il faudrait le code renseigne "flag1".

Ensuite, si tu n'arrive pas a rentrer dans le if et que le programme plante c'est que if = null donc que la variable n'est jamais instancie. Bizarre...

Si la variable est correctement renseignée,il n'y a aucune raison que le programme plante quelque soit sa valeur.

 

;)

PIRO Charles

Developpeur Revit, RV/RA - Formateur Revit

PIRO CIE

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é