Boris Dagnon
Membres-
Compteur de contenus
8 -
Inscription
-
Dernière visite
Boris Dagnon's Achievements
Newbie (1/14)
0
Réputation sur la communauté
-
Dessiner Rectangle
Boris Dagnon a répondu à un(e) sujet de Boris Dagnon dans ObjectARX/DBX, C++, .NET, RealDWG
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); } -
Dessiner Rectangle
Boris Dagnon a répondu à un(e) sujet de Boris Dagnon dans ObjectARX/DBX, C++, .NET, RealDWG
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: -
Dessiner Rectangle
Boris Dagnon a répondu à un(e) sujet de Boris Dagnon dans ObjectARX/DBX, C++, .NET, RealDWG
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. -
Dessiner Rectangle
Boris Dagnon a répondu à un(e) sujet de Boris Dagnon dans ObjectARX/DBX, C++, .NET, RealDWG
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) -
Dessiner Rectangle
Boris Dagnon a répondu à un(e) sujet de Boris Dagnon dans ObjectARX/DBX, C++, .NET, RealDWG
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; } -
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); } }
-
En fait je pense s'avoir la ou ça coince. Lorsque que définit l'échelle de l'objet que je vais insérer dans mon plan, je remarque que la valeur renvoyé est égale à 0. Après analyse du code j'ai remarqué que la récupération de l'échelle ne s'effectuait pas correctement. public double RecupEchelle(AcadDocument doc) { object XDataType = new object(); //Instanciation d'un nouvel objet XDataType object XDataValue = new object();//Instanciation d'un nouvel objet XDataValue object[] objArray = new object[2];//Instanciation d'un nouveau tableau d'objet contenant 2 objets doc.Layers.Item((object) "JFC_EVAPORATEUR").GetXData("", out XDataType, out XDataValue); double resultat= Convert.ToDouble(((object[]) XDataValue)[1]); return resultat; } Ensuite après que la valeur de cette méthode soit renvoyé j'effectue le code suivant: try { for (int index = 0; index < 100; ++index) { numArray[index] = (short) 1000; /*On convertit en entier de 16 bits et on insére la valeur dans numArray[]*/ objArray2[index] = (object) 0; } this.acDoc.ActiveLayer = this.acDoc.Layers.Item((object) Layer); new GetPointCoord.GetPointCoord().GetPoint(this.acDoc, ref objArray1[0], ref objArray1[1]); //Valeur qu'on récupère après la définition de l'échelle------------------------------ double num1 = this.RecupEchelle(this.acDoc); double num2; double num3; switch (Orientation) { case "Verticale": num2 = num1 * Math.Sqrt((double) Puissance / 40000.0 + 0.2); num3 = 2.0 * num2; break; case "Horizontale": num3 = num1 * Math.Sqrt((double) Puissance / 40000.0 + 0.2); num2 = 2.0 * num3; break; default: num3 = num1 * Math.Sqrt((double) Puissance / 40000.0 + 0.2); num2 = 2.0 * num3; break; } double[] Point = new double[10] { (double) objArray1[0] - num2 / 2.0, (double) objArray1[1] + num3 / 2.0, (double) objArray1[0] + num2 / 2.0, (double) objArray1[1] + num3 / 2.0, (double) objArray1[0] + num2 / 2.0, (double) objArray1[1] - num3 / 2.0, (double) objArray1[0] - num2 / 2.0, (double) objArray1[1] - num3 / 2.0, (double) objArray1[0] - num2 / 2.0, (double) objArray1[1] + num3 / 2.0 }; AcadLWPolyline acadLwPolyline = this.acDoc.ModelSpace.AddLightWeightPolyline((object) Point); acadLwPolyline.Closed = true; if (Layer == "JFC_EVAPORATEUR" || Layer == "JFC_DOUBLE_EVAPORATEUR") this.Text(Point, Layer, Puissance); numArray[0] = (short) 1001; objArray2[0] = (object) "JFC_TRACEUR"; numArray[1] = (short) 1071; objArray2[1] = (object) Puissance; numArray[2] = (short) 1071; objArray2[2] = (object) nbC; int index1 = 0; int index2 = 3; while (index2 <= nbC + 4) { numArray[index2] = (short) 1070; objArray2[index2] = (object) tab[index1].nb; numArray[index2 + 1] = (short) 1000; objArray2[index2 + 1] = (object) tab[index1].Type; numArray[index2 + 2] = (short) 1040; objArray2[index2 + 2] = (object) tab[index1].section; ++index1; index2 += 3; } acadLwPolyline.SetXData((object)numArray, (object)objArray2); }
-
Mise à jour application C#
Boris Dagnon a répondu à un(e) sujet de -Olivier- dans ObjectARX/DBX, C++, .NET, RealDWG
Salut c'est mon vrai compte ça, j'utilisais le compte d'un ami qui m'avais conseillé d'utiliser le tien car mon projet étais important. Excusez moi :-D Je voudrais vous remercié pour votre aide :-D. Du coup je ne sais pas comment j'aurai du faire pour ne pas avoir à décomplier et recompiler les deux dll ?
