coyotte Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Bonjour à tous, voici mon nouveau problème. Je voudrais dessiner un arc de cercle, je connais son centre, son point de départ, son point d'arrivée et son rayon. Je n'ai pas trouvé la méthode qui va bien. En effet je ne connais ni son angle de départ, ni son angle d'arrivée. Merci d'avance de toute l'aide que vous voudrez bien m'apporter. http://www.carpetdiem.netPlugins pour AutoCAD
Invité Patrick Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Eh bien tu cliques sur l'icône ARC par Centre, départ, fin, non? :mellow:
coyotte Posté(e) le 2 octobre 2011 Auteur Posté(e) le 2 octobre 2011 En effet Patrick Le problème est que je voudrais réaliser ça en C# :( http://www.carpetdiem.netPlugins pour AutoCAD
Invité Patrick Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Voilà ce que c'est de pas regarder dans quel forum on est! Je laisse la main à (gile), y a pas photo... :huh:Pourtant j'l'aimais bien ma réponse! :P
didier Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 coucou voir ma demande sur la "colorisation" des forums ... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Invité Patrick Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 J'avais vu ta suggestion de colorisation didier, mais comme je suis abonné à plusieurs dizaines de forums, je doute pouvoir me rappeler de la signification de plusieurs dizaines de couleurs. non, en l’occurrence, il suffisait que je lise le nom du forum, j'ai été trompé par le contenu du message, qui ne pouvait pas évoquer le nom du forum dans lequel il a été posté.
didier Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 coucou" je te rassure, est-ce utile ? d'ailleursil m'arrive souvent de commencer une réponseet de m'apercevoir que je suis hors forumdu style du lisp pour LTdu Covadis pour Mensuraet comme toi à l'instant du bon sens de dessin pour du C# (hihihi) ça se reproduira sans doute encore ... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
(gile) Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Salut, Il faut calculer les angles de départ et de fin en fonction du centre et des points de départ et de fin. Pour ce faire, il va falloir utiliser un peu de calcul vectoriel (la classe Autodesk.AutoCAD.Geometry.Vector3d fournit les méthodes), notamment le produit vectoriel qui va indiquer si l'angle de l'arc est inférieur ou supérieur à 180°. Le produit vectoriel du vecteur centre/départ par le vecteur centre/fin retourne le vecteur perpendiculaire à ces deux là (le vecteur normal du plan défini par les 3 points) en considérant le plus petit angle entre les vecteurs.Donc, si la coordonnée Z du vecteur normal est négative, ça indique que l'angle a été mesuré en sens horaire, par conséquent que l'angle de l'arc est supérieur à 180° (voir une explication en image ici). Dans ce cas il suffit d'utiliser le vecteur inverse (méthode Negate()) du vecteur normal pour les calculs suivants. On obtient un angle entre deux vecteurs 3d avec la méthode Vector3d.GetAngleTo() qui requiert deux paramètres : le vecteur jusqu'au quel mesurer l'angle et un vecteur de référence. Ce dernier est nécessaire pour avoir un angle dans l’intervalle de 0° à 360°, il correspond au vecteur normal du plan sur lequel est mesuré l'angle entre les vecteurs, c'est le vecteur normal qu'on a calculé précédemment. Il reste à voir que faire des situations particulières : si les 3 points sont alignés.Si les points de départ et de fin sont tous deux du même côté du centre (confondus), il n'est pas possible de dessiner d'arc, il aurait une longueur nulle.Si les deux points sont situés de part et d'autre du centre (l'arc est un demi-cercle), il manque une donnée : le plan de construction de l'arc. En 2d ce plan est parallèle au plan XY on peut construire l'arc sur ce plan, en 3d on ne peut le déterminer. Un petit exemple commenté private Arc MakeArc(Point3d center, Point3d startPoint, Point3d endPoint, double radius) { double startAngle, endAngle; Vector3d normal = Vector3d.ZAxis; Vector3d v1 = startPoint - center; Vector3d v2 = endPoint - center; // les points de départ et de fin sont alignés du même côte centre (confondus) if (v1.IsCodirectionalTo(v2)) { Application.ShowAlertDialog("Arc de longueur nulle"); return null; } // les points de départ et de fin sont alignés de part et d'autre du centre if (v1.IsParallelTo(v2)) { // si les vecteurs sont parallèles au plan XY, construction 2d arbitraire if (v1.Z == v2.Z) { // calculs des angle par rapport à l'axe X du SCG startAngle = Vector3d.XAxis.GetAngleTo(v1, Vector3d.ZAxis); endAngle = Vector3d.XAxis.GetAngleTo(v2, Vector3d.ZAxis); } else { Application.ShowAlertDialog("Plan de construction indéterminé"); return null; } } else { // calcul du vecteur normal du plan normal = v1.CrossProduct(v2).GetNormal(); // correction de la normale si les points sont en sens horaire (angle > 180°) if (normal.Z < 0) normal = normal.Negate(); // plan de construction de l'arc Plane plane = new Plane(Point3d.Origin, normal); // vecteur à partir du quel mesurer les angles (tranformation de l'axe X du plan de construction) Vector3d ocsXaxis = Vector3d.XAxis.TransformBy(Matrix3d.PlaneToWorld(plane)); // calcul des angles startAngle = ocsXaxis.GetAngleTo(v1, normal); endAngle = ocsXaxis.GetAngleTo(v2, normal); } Arc arc = new Arc(center, normal, radius, startAngle, endAngle); return arc; } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
coyotte Posté(e) le 2 octobre 2011 Auteur Posté(e) le 2 octobre 2011 Merci gile :D Juste un problème, dans ton premier (if) la variable normal n'est pas initialisée, donc grosse rouspetance de visual studio qui me dit que la variable normal utilisée sur le return n'est pas initialisée :( merci encore pour la rapidité de réponse. http://www.carpetdiem.netPlugins pour AutoCAD
Invité Patrick Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Mon dieu, mon dieu, mon dieu, et dire que c'est du LISP qu"on se moquait... :blink:(désolé Gilles, j'ai pas pu m'empêcher... et bravo encore pour l'étendu de ton savoir)
(gile) Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Oupss !...En nettoyant le code, j'ai oublié ça.C'est réparé. Il suffisait de l'initialiser au début du cade avec :Vector3d normal = Vector3d.ZAxis;où la propriété statique ZAxis correspond au vecteur de coordonnée 0,0,1 qui sera utilisé s'il n'est pas recalculé. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Mon dieu, mon dieu, mon dieu, et dire que c'est du LISP qu"on se moquait... :blink:(désolé Gilles, j'ai pas pu m'empêcher... et bravo encore pour l'étendu de ton savoir) En LISP ça ne serait pas vraiment plus simple, AutoLISP ne fournit pas de fonction de calcul vectoriel, il faut tout implémenter soi même (voir le sujet donné en lien).J'ai peut-être un peu compliqué la chose en voulant donner une méthode qui ne fonctionne pas qu'en 2d, mais on ne peut échapper au calcul du produit vectoriel (ou d'une méthode équivalente) pour déterminer si les points spécifiés 'tournent' en sens horaire ou trigonométrique, Un arc étant toujours défini en sens trigonométrique. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité Patrick Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Ben moi en LISP j'aurais lancé une bonne vieille commande AutoCAD avec un bon vieux (command) de derrière les fagots! ;) Mais bon je suis de la vieille école.
(gile) Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Ben moi en LISP j'aurais lancé une bonne vieille commande AutoCAD avec un bon vieux (command) de derrière les fagots! ;) Mais bon je suis de la vieille école. On peut faire ça en NET aussi, mais, comme en LISP, ça a ses limites : ne fonctionne qu'en 2d dans le plan du SCU courant. private void DrawArc(Point3d center, Point3d startPoint, Point3d endPoint, double radius) { Document doc = AcAp.DocumentManager.MdiActiveDocument; string cmd = string.Format( "_arc _c {0} {1} {2} ", center.ToString().Trim('(', ')'), startPoint.Convert2d(new Plane()).ToString().Trim('(', ')'), endPoint.Convert2d(new Plane()).ToString().Trim('(', ')')); doc.SendStringToExecute(cmd, false, false, false); } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Invité Patrick Posté(e) le 2 octobre 2011 Posté(e) le 2 octobre 2011 Oui, il suffit avant de changer de SCU.
coyotte Posté(e) le 2 octobre 2011 Auteur Posté(e) le 2 octobre 2011 Merci encore Gile de bien vouloir partager avec nous pauvre ignares :(rires forts): ces connaissances qui nous font si cruellement défaut. Je pense que je serais surement amené à faire de nouveau appel à vous tous pour me sortir de mes misères de programmeur :D http://www.carpetdiem.netPlugins pour AutoCAD
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