zuperpuz Posté(e) le 12 juillet 2011 Posté(e) le 12 juillet 2011 D'abord un grand bonjour à toute et à tous.Je suis nouveaux sur le forum, c'est un de mes premier poste. Je remercie déjà la communauté de ce forum car j'ai déjà beaucoup apprit grâce à ce forum. Avant de poser une question je fait toujours de bonne recherche donc c'est suite a une recherche profonde mais sans résultat que je demande votre aide. Donc J'ai un petit Lisp qui me fait des présentation de manière automatique par rapport à des blocs dans l'espace objet. Je d'écrie les différente étape histoire de comprendre le contexte. 1- Récupération des infos (attribut bloc) du bloc "n-gaine"2- Création d'une présentation avec différente info du bloc 3- Je passe sur la présentions crée pour qu'Autocad y insère une "PViewport" (une fenêtre en espace papier), aucun autre moyen d'en crée une a ma connaissance (n'hésiter pas a me le faire savoir si on peut ajouter une "PViewport" sans être obligée de d'activée la présentation, ça m'éviterais une régénération qui ralenti mon code). (setq Presentation (vla-item (vla-get-layouts Document_Actif) Nom_Pre)) (vla-put-activelayout Document_Actif Presentation) (setq Bloc_Presentation (vla-get-block Presentation)) (vlax-for Bloc_item Bloc_Presentation (vla-delete Bloc_item) ) (setq Fenetre_Pre (vla-AddPviewport (vla-get-PaperSpace Document_Actif) (vlax-3D-point '(101.5 133.0)) 187.0 246.0 ) ) 4- Ensuite pour modifiée la vue a l'interieur de la fenetre je suis obliger de l'activer aussi. (vla-Display Fenetre_Pre :vlax-true) (vla-put-mspace Document_Actif :vlax-true) (vla-put-activePviewport Document_Actif Fenetre_Pre) (vla-zoomcenter (vlax-get-acad-object) (vlax-3d-point (trans Pt_Base 2 0)) 1 ) (vla-put-mspace Document_Actif :vlax-false) (vla-put-StandardScale Fenetre_Pre acVp1_1) Donc j'aimerai améliorer deux chose: 1 Insérer une "PViewport" dans ma présentation sans être obliger de l'activée2 Pouvoir modifiée la vue de la fenêtre en espace papier sans être obligée de l'activer et d'utiliser la commande zoom (a ce propos j'ai remarquée que les infos sur la vue de la fenêtre son stockée en xdata dans l'objet "Pviewport" mais impossible de les modifier.)
(gile) Posté(e) le 12 juillet 2011 Posté(e) le 12 juillet 2011 Salut, Je crains que ce que tu demandes ne soit pas possible en LISP. La méthode AddPViewport étant une méthode de l'objet PaperSpace.Avec .NET on ajoute la fenêtre au "bloc" de la présentation, ceci peut donc être fait de manière "transparente" (CF ici). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zuperpuz Posté(e) le 12 juillet 2011 Auteur Posté(e) le 12 juillet 2011 Ça fait 6 mois que je développe en Lisp et je commence à en voir les limites.Je devrai peut être me mettre au .NET tout de suite . non ? EDIT : Merci pour la réponse rapide. :) [Edité le 12/7/2011 par zuperpuz]
(gile) Posté(e) le 12 juillet 2011 Posté(e) le 12 juillet 2011 Ça fait 6 mois que je développe en Lisp et je commence à en voir les limites.Je devrai peut être me mettre au .NET tout de suite . non ? :o tu es un rapide, en 6 mois tu sembles avoir appris et compris beaucoup de choses. ;) Mais suivant la direction qu'on prends, on atteind plus ou moins rapidement une limite.Je programme AutoCAD en LISP de puis presque 10 ans, et si j'ai rencontré certaines limites, je ne pense pas en avoir fait le tour et j'en apprends encore tous les jours. Certes, .NET est plus puissant, mais a aussi ses limites. Faut-il pour autant passer tout de suite à ObjectARX/C++ ?... Ce qui fait la "puissance" du LISP c'est sa simplicité, son intime intégration dans AutoCAD et, surtout sa relative facilité d'apprentissage. L'aventure .NET est une tout autre histoire.L'apprentissage sera forcément plus long et plus difficile.Je ne dit pas ça pour décourager qui que ce soit (au contraire, j'aimerais que nous soyons plus nombreux à se frotter à cet environnement) mais je veux juste prévenir que là, on ne joue plus vraiment dans la même cour. En LISP, pour faire une commande qui dessine un cercle, il suffit de faire :(defun c:foo () (command "_circle" '(0. 0. 0.) 10.) (princ) )Ou encore si on chasse les millisecondes :(defun c:foo () (entmake '((0 . "CIRCLE") (10 0. 0. 0.) (40 . 0.))) (princ) )Ou encore, si on ne jure que par le vlisp :(defun c:foo () (vl-load-com) (vla-AddCircle (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object))) (vlax-3d-point '(0. 0. 0.)) 40. ) (princ) ) Avec .NET, il va falloir créer une classe dans un espace de nom, dans cette classe, définir une méthode dans laquelle instancier la base de donnée du document, utiliser une transaction pour ouvrir l'espace courant, créer un objet cercle, l'ajouter à l'espace courant et à la transaction, enregistrer ces modifications et libérer les ressources, et ce, depuis un IDE extérieur à AutoCAD ce qui ne facilite pas le débogage...Ceci va faire beaucoup plus de code, mais surtout, il va falloir apprendre et comprendre pourquoi tout ça nécessaire.using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; namespace CircleSample { public class CircleClass { [CommandMethod("foo")] public void AddCircle() { Database db = HostApplicationServices.WorkingDatabase; using (Transaction tr = db.TransactionManager.StartTransaction()) { BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite); Point3d center = new Point3d(0.0, 0.0, 0.0); Circle circle = new Circle(center, Vector3d.ZAxis, 10.0); btr.AppendEntity(circle); tr.AddNewlyCreatedDBObject(circle, true); tr.Commit(); } } } } Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zuperpuz Posté(e) le 15 juillet 2011 Auteur Posté(e) le 15 juillet 2011 Une fois de plus merci gilles pour toutes ces infos.J'aime beaucoup le Lisp c'est simple et on peu déjà faire pas mal de chose. Et surtout je développe dans Autocad.Je travail dans l'étude plomberie sanitaire chauffage pour le logement collectif et j'en avais mare de faire une présentation pour chaque gaine technique sachant qu'il y en a des vingtaines par bâtiment multiplié par le nombre de niveaux :pEt j'ai développé mon premier Lisp pour crée les détails de gaines (dés présentation A4) automatiquement. Encore quelques petites questions :-Je peu modifier Les Xdata q'autocad utilise dans les objet "PViewport" pour la vue et pour les calque geler ? _$ (entget (car (entsel)) '("ACAD")) ((-1 . )....(-3 ("ACAD" (1000 . "MVIEW") (1002 . "{") (1070 . 16) (1010 0.0 0.0 0.0) (1010 0.0 0.0 1.0) (1040 . 0.0) (1040 . 3711.84) [b] (1040 . 6280.67) (1040 . 2214.75)[/b] (1040 . 50.0) (1040 . 0.0) (1040 . 0.0) (1070 . 0) (1070 . 1000) (1070 . 1) (1070 . 3) (1070 . 0) (1070 . 0) (1070 . 0) (1070 . 0) (1040 . 0.0) (1040 . 0.0) (1040 . 0.0) (1040 . 10.0) (1040 . 10.0) (1040 . 10.0) (1040 . 10.0) (1070 . 0) (1002 . "{") (1002 . "}") (1002 . "}") ))) -Je peu utiliser le petit morceau de code .NET dans mon lisp pour la création des "PViewport" sans régen ? (ça m'évitera de réapprendre un nouveaux langage :p) Bon weekend a Tous !
zuperpuz Posté(e) le 16 mai 2012 Auteur Posté(e) le 16 mai 2012 Re-bonjourMe revoilà pour répondre a ma propre question.Je vais partager ce que j'ai appris. Donc entre temps j'ai appris le C# et j'ai bien fouillé l'API d'autocadDonc pou geler des calques particulier dans un Viewport (ou fenêtre en bon français) il y a tout simplement une méthode pour les instances des objets Viewport. Voici un exemple dans mon programme en particulier: // la methode pour ajouter la fenetre dans la présentation private ObjectId AjouterModelViewport(ObjectId LayoutBlockTabRecId) { //la petite Transaction using (Transaction acTrans = acCurDb.TransactionManager.StartTransaction()) { //on ouvre le Bloc de la présentation pou y ajouter la fenetre BlockTableRecord btrLayout = (BlockTableRecord)acTrans.GetObject(LayoutBlockTabRecId, OpenMode.ForWrite); // Une nouvelle fenêtre Viewport viewport = new Viewport(); // On spécifie ces propriétés viewport.CenterPoint = new Point3d(101.5, 126.0, 0.0); viewport.Width = 187.0; viewport.Height = 246.0; VerifCreaLayer(); viewport.Layer = "BeS-Cartouche"; viewport.StandardScale = StandardScaleType.Scale1To1; viewport.ViewTarget = PointBase; // là on gèle des calques a l’intérieur de la fenêtre // l'argument ListeCalqueGeler et un objet ObjectIdCollection viewport.FreezeLayersInViewport(ListeCalqueGeler.GetEnumerator()); // on ajoute tous ça a la présentions btrLayout.AppendEntity(viewport); acTrans.AddNewlyCreatedDBObject(viewport, true); acTrans.Commit(); ModelViewport = viewport.Id; return viewport.Id; } }
Tramber Posté(e) le 16 mai 2012 Posté(e) le 16 mai 2012 Pour revenir au mois de juillet, je précise juste qu'il y a la variable LAYOUTREGENCTL pour ton problème en lisp. Maintenant, je reste sans voix quant à ton retour : Donc entre temps j'ai appris le C# et j'ai bien fouillé l'API d'autocadPendant les week-ends ou durant les heures de travail ? ;) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 16 mai 2012 Posté(e) le 16 mai 2012 Chapeau bas pour la rapidité de l'apprentissage ! Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
zuperpuz Posté(e) le 26 mai 2012 Auteur Posté(e) le 26 mai 2012 Pour revenir au mois de juillet, je précise juste qu'il y a la variable LAYOUTREGENCTL pour ton problème en lisp. J'avais déjà essayer ça ne marchais pas. J'ai fait ça dans mes temps libres en semaine et les week-end, j'avais des bases de programmation sur les automates (langage LADER et Graf7).Pour le C# j'ai été sur le site du zéro leurs tutoriels sont excellent.En fait, j'apprécie le fait de faire du dessin et de la programmation en parallèle pour simplifier les taches de publication des plans pour me concentrer sur le vif du sujet le dessin d’exécution en lui même. En tout cas merci a vous pour vos encouragement. je continuerais à partager mes découverte.
GEGEMATIC Posté(e) le 5 juin 2012 Posté(e) le 5 juin 2012 Chapeau bas pour la rapidité de l'apprentissage !Je crois que tu as trouvé un vrai "client"dans pas longtemps vous dicuterez tous les 2, et on y comprendra rien ... ----------------------------------------------------------------------Site: https://www.g-eaux.frBlog: http://g-eaux.over-blog.com
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