
bathepn
Membres-
Compteur de contenus
23 -
Inscription
-
Dernière visite
Tout ce qui a été posté par bathepn
-
crée une présentation
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Stage d'informatique de 3ième année d'école d'ingénieur : INSA de Lyon Durée totale du stage : 3 mois sans jamais avoir connu AutoCAD avant ^^ Je vais essayer de faire ça un peu à la main pour comprendre mieux comment ça marche :/ Merci -
crée une présentation
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Je ne demande que ça d'apprendre mais AutoCAD est vraiment complexe donc c'est compliqué et je n'ai pas beaucoup de temps :) -
crée une présentation
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
En effet je ne connais pas ou peu AutoCAD. J'ai découvert ça il y a maintenant 2 mois (stage, un mois en réalité, le premier moi était pour la création du "cerveau" du logiciel). Néanmoins je n'ai pas le choix, on me demande de le programmer durant mon stage donc j'apprend sur le tas, je connais un peu .NET mais pas AutoCAD. J'ai découvert hier ce que c'était que ces présentations, en gros la vue Objet en mode imprimable avec une séletion de ce qu'on veux imprimer et un cartouche pour exempliquer ce que c'est (oui c'est réducteur :) ) J'ai pas le choix il faut quand même que je le programme, un peu d'aide serai pas de trop pour m'éviter de passé le mois qu'il me reste de stage sur cette fonctionnalité :) -
crée une présentation
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
ah ok, je trouvais ça bizarre un programme en image mais oui bien sur le but est de le faire en .NET ... -
crée une présentation
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Tout d'abord merci pour vos deux réponses. @Gile : j'ai regardé l'exemple, il est en effet très simple mais permet bien de crée un nouveau layout. J'avoue ne pas avoir compris ce qu'est le viewport et son utilité. Concernant la doc c'est bien mais c'est surtout un labyrinte de lien qui s'entrecoupent, je me dis Ah un lien qui pourrait correspondre et il me renoie vers une liste de lien sans exemple concrêt pour réponde au titre ... @HBS62 : tes liens ne marchent pas, je n'ai pas la permission de les voir. En tout cas dans ta description cela conviendrait totalement à ce qu'il me faudrait. -
Bonjour J'ai un nouveau boulot à faire et je vois pas du tout comment faire. J'ai un plan avec dans la vue Objet tout plein d'Entity crées dans tout plein de calques. Actuelement j'ai un mécanisme pour gérer tout ces calques et n'afficher que ce qu'il faut à l'écran, mon but maintenant est de créer une présentation de ce calque. Avec une echelle et un cartouche. Un truc beau et imprimable. Quelqu'un pourrais m'aiguiller et/ou me donner un exemple simple ? je sais même pas quoi chercher sur internet en fait. Merci d'avance pour vos réponses
-
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Merci pour toutes ces explications :) -
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
J'ai trouvé !!!! L'idée du regen était bonne mais ne marchait pas avec moi, j'ai utiliser une autre méthode. une fois le dégèle des calque je fais ça : document.SendStringToExecute("_REGENALL ", true, false, false); et ça m'affiche ce qu'il faut :) -
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Je crois que mes transactions je les termine pas comme il faut. public static void Commit() { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non créée"); } transaction.Commit(); transaction = null; document = null; } Je ne fais jamais de dispose c'est peut-être pas normal. Mais c'est vraiment bizarre car si j'execute deux fois de suite le code pour geler mes calques ça marche alors que pourtant j'ai vérifié il passe dans les même tests et les même instructions. http://9gag.com/gag/anYZ9Eo/my-code-works-but-i-don-t-know-why -
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Oui et encore merci de l'aide :) pas de boite de dialogue mais il est vrai que je les appel depuis un event d'une palette crée avec WPF. Pour le focus il y a un autofocus à false sur mon PaletSet : _ps.KeepFocus = false; Je ne vois pas ce que tu veux dire pour la "simple commande AutoCAD" :/ Le problème est que lorsque je fais le regen ça m'affiche bien les informations mais quand mon curseur retourne sur l'écran d'autocad tout disparaît comme si je n'avais pas fait le regen. -
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Les méthodes sont toutes indépendantes les une des autres d'où parfois une redondance dans les tests. Il est lisible dans le sens qu'il suffit de "lire" le code d'une fonction pour comprendre, sans forcément aller voir le contenu des sous fonctions :) la layerTable est bien initialisé, je n'ai aucun problème avec juste comme je disais le dégèle des calques sui n'affiche pas les Entity sur le calque. (Les Entity sont bien sur le calque, quand je le fait à la main via l'IHM d'Autocad je n'ai pas de problème). -
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Pas d'autres idées ? -
dégèle d'un calque
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
j'ai mis un Regen mais ça ne marche pas au clic que le bouton, il faut deux clic que le bouton pour que les Entity s'affiche. private void RadioButton_Checked_2(object sender, RoutedEventArgs e) { MonAutocad.NouvelleTransaction(); MonAutocad.GelerCalque(new Regex("^" + CONSTANTES.VUE.CALQUE_ABC + "i?n[\\dt]"), true); MonAutocad.GelerCalque(CONSTANTES.VUE.CALQUE_ABC + "n" + niveau, false); MonAutocad.SetCalqueCourant(CONSTANTES.VUE.CALQUE_ABC + "n" + niveau); MonAutocad.Commit(); } //J'ai mis le regen ici : public static void SetCalqueCourant(string nom) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non créée"); } if (getCalque(nom) == database.Clayer) return; GelerCalque(nom, false); CacherCalque(nom, false); VerrouillerCalque(nom, false); database.Clayer = getCalque(nom); editor.Regen(); } CacherCalque et VerouillerCalque sont comme GelerCalque (juste une propriété qui change) -
Bonjour J'ai une fonction pour geler ou dégeler un calque. Le problème est que lors du dégèle les Entity qui sont dans ce calque n'apparraissent pas à l'écran. Savez vous comment faire ? Voici mes fonctions : public static void GelerCalque(string nom, bool geler) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non créée"); } if (ExisteCalque(nom)) { if (getCalque(nom) == database.Clayer) SetCalqueCourant("0"); LayerTableRecord ltr = (LayerTableRecord)transaction.GetObject(getCalque(nom), OpenMode.ForWrite); ltr.IsFrozen = geler; } } public static bool ExisteCalque(string nom) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non créée"); } return layerTable.Has(nom); } private static ObjectId getCalque(string nom) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non créée"); } if (!ExisteCalque(nom)) { throw new ExceptionCalque("Le calque " + nom + " n'existe pas"); } return layerTable[nom]; } Merci d'avance de vos réponses.
-
Désolé pour ce post j'ai fini par trouver. C'était ça : texte.Attachment = AttachmentPoint.MiddlMid; Ou autre de l'enum :)
-
Bonjour J'aimerais savoir comment faire pour centrer un MText ? en .NET Je m'explique un peu :) => comme mis dans un post précédent ainsi que dans une autre situation je calcul un point où je vais placer mon MText. Maintenant j'aimerais center mon texte horizontalement et verticalement autour de ce point. En effet le point d'implantation d'un MText est en haut à gauche et j'aimerais savoir comment calculer le centre en fonction du contenus du texte. Merci d'avance Bapthepn
-
chargement dll sur demmande
bathepn a répondu à un(e) sujet de bathepn dans ObjectARX/DBX, C++, .NET, RealDWG
Merci de la réponse, problème résolu, je n'avais pas trouvé ce post :) -
Bonjour J'aimerai savoir s'il est possible en .NET (pas en AutoLISP) de ne charger une dll qui contient tout un logiciel uniquement lors du passage d'une commande. Exemple : commande sur autocad : toto Résultat : chargement sur autocad d'une dll à un emplacement "mon_emplacement/dllDeToto.dll" cette dll contiendra la définition de la commande toto et exécutera le logiciel qui démmare comme ça : [CommandMethod("toto", CommandFlags.Session)] public static void toto() { // beaucoup de code } Merci d'avance pour vos réponses Bathepn
-
Un grand merci à toi ! j'ai réussi à adapter ta solution à mon programme :) ça marche nikel maintenant :)
-
Je passe par des objet Tampon générique afin que ma classe de gestion d'autocad soit complètement indépendante du reste de l'application. En effet j'ai oublié une fonction. public static List<System.Drawing.PointF> GetPolyligne(ObjectId id, double echelle) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non crée"); } Matrix3d xform = Matrix3d.Scaling(echelle, Point3d.Origin); List<System.Drawing.PointF> listeDePoints = new List<System.Drawing.PointF>(); try { var sol = transaction.GetObject(id, OpenMode.ForRead) as Autodesk.AutoCAD.DatabaseServices.Polyline; for (int i = 0; true; i++) { try { Point3d tmp = sol.GetPoint3dAt(i).TransformBy(xform); listeDePoints.Add(new System.Drawing.PointF((float)tmp.X, (float)tmp.Y)); } catch (System.Exception ex) { break; } } if (sol.Closed) { listeDePoints.Add(new System.Drawing.PointF(listeDePoints[0].X, listeDePoints[0].Y)); } } catch (System.Exception ex) { throw new ExceptionMauvaisObjet("Ce n'est pas une polyligne"); } if (listeDePoints.Count == 0) { throw new ExceptionMauvaisObjet("Ce n'est pas une polyligne"); } return listeDePoints; } Pour les exception ce sont des exceptions maisons qui héritent de la classe Exception :) En effet je ne savais pas je ferais la modification dans ma fonction :) C'est ce que je fais sauf que le texte n'est pas affiché comme il faut. Quand je calcul mon centre c'est avec le repère WCS donc le nord calculé est peutêtre l'est en vrai dnas le scu courant donc la position de mon point est pas bonne. Deplus le texte est horizontal dans le SCU Général donc quand on passe dans un autre ou dnas le Courant il ne l'est plus. J'ai bien essayé un texte.rotation = 0; mais le point de rotation es en haut à gauche du texte et non au centre donc ça tourne pas bien.
-
Je récupère les points d'une Polyligne comme ceci : public static List<List<System.Drawing.PointF>> SelectionnerPolyligne(string question, double echelle) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non crée"); } PromptSelectionResult selectionResult = editor.SelectImplied(); List<ObjectId> listeId = new List<ObjectId>(); if (selectionResult.Status == PromptStatus.Error) { PromptEntityResult per = editor.GetEntity("\n" + question); if (per.Status != PromptStatus.OK) { return null; } listeId.Add(per.ObjectId); } else { editor.SetImpliedSelection(new ObjectId[0]); ObjectId[] objIds = selectionResult.Value.GetObjectIds(); for (int i = 0; i < objIds.Length; i++) listeId.Add(objIds[i]); } var listeResultat = new List<List<System.Drawing.PointF>>(); foreach (ObjectId id in listeId) { try { listeResultat.Add(GetPolyligne(id, echelle)); } catch (ExceptionMauvaisObjet ex) { MonAutocad.EcrireDansLaConsole("Un objet détecté n'était pas une polyligne"); } } MonAutocad.EcrireDansLaConsole(listeResultat.Count + " polyligne" + ((listeResultat.Count > 1) ? "s" : "") + " trouvée" + ((listeResultat.Count > 1) ? "s" : "") + "."); return listeResultat; } puis je calcul le centre de la Polyligne pour écriredu texte centré comme ceci : private System.Drawing.PointF centre(List<System.Drawing.PointF> liste, string texte = "", double echelle = 1) { float nord = liste[0].Y; float sud = liste[0].Y; float est = liste[0].X; float ouest = liste[0].X; foreach (var point in liste) { if (point.Y < sud) sud = point.Y; if (point.Y > nord) nord = point.Y; if (point.X > est) est = point.X; if (point.X < ouest) ouest = point.X; } var pt = new System.Drawing.PointF((est + ouest) / 2 - (float)(texte.Length * CONSTANTES.VUE.LARGEUR_LETTRE * echelle / 2), nord - (nord - sud) / 2); return pt; } et enfin je place mon texte comme ceci : private static ObjectId ajouterObjet(Entity entity) { if (transaction == null) { throw new ExceptionTransactionAutocadInvalide("Transaction non crée"); } ObjectId id = blockTableRecord.AppendEntity(entity); ajouterObjetALaTransaction(entity); return id; } public static ObjectId AjouterTexte(System.Drawing.PointF origine, string contenu, double echelle, System.Drawing.Color couleur, Hauteur hauteur = Hauteur.NORMAL) { bool creationDuGroupe = !existeUnGroupeCree(); if (creationDuGroupe) { blockTableRecord = (BlockTableRecord)transaction.GetObject(blockTable[blockTableRecord.ModelSpace], OpenMode.ForWrite); } MText texte = new MText(); texte.Contents = contenu; texte.Location = new Point3d(origine.X / echelle, origine.Y / echelle, 0); texte.Color = Color.FromColor(couleur); ObjectId id = ajouterObjet(texte); texte.TextHeight *= (int)hauteur; if (creationDuGroupe) { blockTableRecord = null; } return id; } Le problème est que le texte s'affiche bien dans le SCU nomé "Général" il s'affiche au centre et bien alligné. mais dans les autre SCU il s'afiche penché et plus au centre car pour calculer le centre il prend les coordonnées WCS et non SCU et du coup j'ajoute mon texte aussi avec des coordonnée WCS, il faudrait donc une fonction qui converti de WCS à SCU et une qui fait l'opposé. Concernant l'inverse j'ai essayé ceci : Matrix3d ucs = Application.DocumentManager.MdiActiveDocument.Editor.CurrentUserCoordinateSystem; CoordinateSystem3d cs = ucs.CoordinateSystem3d; Matrix3d newMatrix2 = Matrix3d.AlignCoordinateSystem(Point3d.Origin, Vector3d.XAxis, Vector3d.YAxis, Vector3d.ZAxis, cs.Origin, cs.Xaxis, cs.Yaxis, cs.Zaxis ); Après je crée un point 3d avec les coordonnée WCS et j'ai essayer de faire TransformBy avec ma matrice et toutes les possibilité plus haut et rien n'a marché.
-
Merci pour la réponse :) En effet je ne fais rien au AutoLisp. J'ai regardé le lien et il donne une transformation vers un plan en utilisant un point d'origine et un seul vecteur. Or les SCU en utilise 3. voici ce que j'avais trouvé pour passé de SCU à WCS, je pense que l'inverse doit ressembler mais le calcul matriciel n'est pas commutatif ce qui rend la chose plus compliqué. http://docs.autodesk.com/ACD/2013/ENU/index.html?url=files/GUID-096085E3-5AD5-4454-BF10-C9177FDB5979.htm,topicNumber=d30e730706
-
Bonjour Je suis en train de programmer en .net pour autocad. J'ai un problème avec les SCU. En effet j'ai besoin de placer du texte. Ce texte doit s'afficher horizontalement et au bon endroit. Je calcul les coordonnées du texte en fonction de coordonnées d'une polyligne sauf qu'avec le SCU le NORD n'est pas au bon endroit ect. Quand je calcul mes coordonnées pour le point de départ de mon texte, il n'est alors pas au bon endroit et complètement décalé et retourné. J'ai cherché sur le net et j'ai trouvé comment passé des coordonnées du SCU vers WCS mais jamais l'inverse or c'est ce dont j'ai besoin. Merci d'avance pour vos réponses Bathepn