Boris Dagnon Posté(e) le 28 janvier 2016 Posté(e) le 28 janvier 2016 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); } }
(gile) Posté(e) le 28 janvier 2016 Posté(e) le 28 janvier 2016 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
Boris Dagnon Posté(e) le 28 janvier 2016 Auteur Posté(e) le 28 janvier 2016 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; }
(gile) Posté(e) le 28 janvier 2016 Posté(e) le 28 janvier 2016 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
Boris Dagnon Posté(e) le 29 janvier 2016 Auteur Posté(e) le 29 janvier 2016 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.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)
Goldorak44 Posté(e) le 29 janvier 2016 Posté(e) le 29 janvier 2016 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. ;) 1 PIRO CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
(gile) Posté(e) le 29 janvier 2016 Posté(e) le 29 janvier 2016 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... 1 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Boris Dagnon Posté(e) le 29 janvier 2016 Auteur Posté(e) le 29 janvier 2016 Oui je comprends :-D . Je vais faire ça. Je vous tiens au courant de ce qui bug dans le code. Je pense que comme gile l'a si bien dit c'est un problème d'échelle qui n'est pas renvoyé correctement.
Boris Dagnon Posté(e) le 31 janvier 2016 Auteur Posté(e) le 31 janvier 2016 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:
(gile) Posté(e) le 1 février 2016 Posté(e) le 1 février 2016 Encore une fois, je ne vois rien d'incorrect dans le code affiché même si j'aurais écrit plus simplement: AcadAcCmColor acadAcCmColor = this.acDoc.Application.GetInterfaceObject("AutoCAD.AcCmColor.20"); Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Boris Dagnon Posté(e) le 1 février 2016 Auteur Posté(e) le 1 février 2016 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); }
Goldorak44 Posté(e) le 1 février 2016 Posté(e) le 1 février 2016 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 CharlesDeveloppeur Revit, RV/RA - Formateur RevitPIRO CIE
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