RhymOne Posté(e) le 6 septembre 2010 Posté(e) le 6 septembre 2010 Bonjour,Est-il possible de crée une polyligne (en objet) suivant une fenêtre en présentation??? Merci d'avance DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
Tramber Posté(e) le 6 septembre 2010 Posté(e) le 6 septembre 2010 Le programme AutoCAD le plus génial pour les espaces papier Si serge nous entend !? Sinon retrace le contour et fait un bête CHSPACE ! Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
RhymOne Posté(e) le 6 septembre 2010 Auteur Posté(e) le 6 septembre 2010 Merci tramber de cette réponse sa me fait avancer.Mais aparement cette commande que je ne connaissais pas supprime l'element en presentation et le place en objet.Moi je veut faire ceci sur plusieurs fichiers qui contiennent tous plusieurs presentation. DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
(gile) Posté(e) le 6 septembre 2010 Posté(e) le 6 septembre 2010 Salut, Pour un débutant (si j'en crois le forum choisi) tu mets la barre plutôt haut. Je te donnes une routine qui fonctionne avec une fenêtre rectangulaire. Si la vue de la fenêtre n'est pas une vue de dessus, la polyligne ne sera pas créée dans le plan XY du SCG de l'objet. pour tester :(vp2model (car (entsel "\nSélectionnez une fenêtre de présentation: ")))La routine;; Vp2Model -Gilles Chanteau- ;; Crée une polyligne dans l'espace objet figurant une fenêtre de présentation ;; Retourne le nom d'entité de la polyligne (ENAME) ;; ;; Argument ;; vp : la fenêtre de présentation (ENAME) (defun vp2model (vp / MakePline elst wid ht cen nor) (defun MakePline (pts nor) (entmakex (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(410 . "Model") '(100 . "AcDbPolyline") (cons 90 (length pts)) '(70 . 1) ) pts (list (cons 210 nor)) ) ) ) (setq elst (entget vp)) (cond ((= (cdr (assoc 0 elst)) "VIEWPORT") (setq wid (/ (cdr (assoc 40 elst)) 2.) ht (/ (cdr (assoc 41 elst)) 2.) cen (cdr (assoc 10 elst)) nor (cdr (assoc 16 elst)) ) (MakePline (mapcar (function (lambda (pt) (cons 10 (trans (PCS2WCS pt vp) 0 nor)) ) ) (list (list (- (car cen) wid) (- (cadr cen) ht) (caddr cen)) (list (+ (car cen) wid) (- (cadr cen) ht) (caddr cen)) (list (+ (car cen) wid) (+ (cadr cen) ht) (caddr cen)) (list (- (car cen) wid) (+ (cadr cen) ht) (caddr cen)) ) ) nor ) ) ((= (cdr (assoc 0 elst)) "LWPOLYLINE") (setq vp (cdr (assoc 330 elst)) nor (cdr (assoc 16 (entget vp))) ) (MakePline (mapcar (function (lambda (pt) (cons 10 (trans (PCS2WCS pt vp) 0 nor)) ) ) (mapcar (function cdr) (vl-remove-if-not (function (lambda (x) (= (car x) 10))) elst ) ) ) nor ) ) ) ) ;; PCS2WCS (gile) ;; Traduit les coordonnées d'un point de l'espace papier dans le ;; SCG correspondant à la fenêtre spécifiée ;; (PCS2WCS pt vp) est équivalent à (trans (trans pt 3 2) 2 0) avec vp active ;; ;; Arguments ;; pt : un point ;; vp : la fenêtre (ename ou vla-object) (defun PCS2WCS (pt vp / ang nor scl mat) (vl-load-com) (and (= (type vp) 'VLA-OBJECT) (setq vp (vlax-vla-object->ename vp)) ) (setq pt (trans pt 0 0) elst (entget vp) ang (- (cdr (assoc 51 elst))) nor (cdr (assoc 16 elst)) scl (/ (cdr (assoc 45 elst)) (cdr (assoc 41 elst))) mat (mxm (mapcar (function (lambda (v) (trans v 0 nor T))) '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)) ) (list (list (cos ang) (- (sin ang)) 0.0) (list (sin ang) (cos ang) 0.0) '(0.0 0.0 1.0) ) ) ) (mapcar '+ (mxv mat (mapcar '+ (vxs pt scl) (vxs (cdr (assoc 10 elst)) (- scl)) (cdr (assoc 12 elst)) ) ) (cdr (assoc 17 elst)) ) ) ;; TRP ;; transpose une matrice -Doug Wilson- ;; ;; Argument : une matrice (defun trp (m) (apply 'mapcar (cons 'list m))) ;; MXV ;; Applique une matrice de transformation à un vecteur -Vladimir Nesterovsky- ;; ;; Arguments : une matrice et un vecteur (defun mxv (m v) (mapcar (function (lambda (r) (vxv r v))) m) ) ;; MXM ;; Multiplie (combine) deux matrices -Vladimir Nesterovsky- ;; ;; Arguments : deux matrices (defun mxm (m q) (mapcar (function (lambda (r) (mxv (trp q) r))) m) ) ;; VXS ;; Retourne le produit d'un vecteur par un scalaire ;; ;; Arguments : un vecteur et un réel (defun vxs (v s) (mapcar (function (lambda (x) (* x s))) v)) ;; VXV ;; Retourne le produit scalaire (réel) de deux vecteurs ;; ;; Arguments : deux vecteurs (defun vxv (v1 v2) (apply '+ (mapcar '* v1 v2))) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
RhymOne Posté(e) le 7 septembre 2010 Auteur Posté(e) le 7 septembre 2010 Bonjour à tous,Merci gile je vais testé sa.Par contre lorsque je decortique le lisp tu fais appel à ;; TRP ;; transpose une matrice -Doug Wilson- ;; ;; Argument : une matriceLes mattrices sont vraimeent nécessaire pour ce genre de lisp. Alors la oui j'ai tapé un peu fort !!Je file au test merci Gile DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
(gile) Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 Oui les matrices sont indispensables. La fonction trans (qui utilise aussi des matrices en interne) ne permet pas de faire ces transformations entre l'espace papier et l'espace objet sans activer la fenêtre. C'est avec ces matrice qu'on applique les transformations linéaires (déplacement, mise à l'échelle, rotations) aux vecteurs (et par conséquent aux points). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 (defun c:tos(/) (sssetfirst nil) (setq ent(car(entsel))) (command "_copy" ent "" "0,0" "")(princ"\nCLIC dans la fenêtre") (command "_chspace" ent "" pause "") (command) (command "espacep") ) Moi je propose une routine toute con. Je n'avais pas relevé Mais aparement cette commande que je ne connaissais pas supprime l'element en presentation et le place en objet. Il suffit de la copier avant. Comme tu le vois dans cette routine de débutant.(gile) n'a pas de pitié avec ses matrices :cool: Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
RhymOne Posté(e) le 7 septembre 2010 Auteur Posté(e) le 7 septembre 2010 Merci bien tramber.Tu m'ettones j'ai passé une heure à décortiqué le lisp de gile mais je deviens un peu bargo....Les matrices ont l'air de plair à gile c'est sur...Bonne soirée DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
(gile) Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 Tramber,Ta routine ne fonctionne pas chez moi : il semble que CHSPACE ignore les fenêtres. rhymone,Ce n'est pas que j'aime particulièrement les matrices mais quand on veut programmer un logiciel qui fait du vectoriel, il y a toujours un moment où il faut se pencher sur les problèmes de calcul vectoriel et donc de calcul matriciel pour manipuler ces vecteurs.AutoLISP/Visual LISP ne fournissent pas beaucoup de fonction pour manipuler les vecteurs (ObejectARX et l'API AutoCAD .NET sont beaucoup mieux équipés). Il faut donc bien se faire ses propres routines. Ceci dit, il semble qu'effectivement je fasse parti de ceux qui ont le plus creusé la question parmi les LISPeurs fréquentant les forums francophones (voire anglophones). Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 Tramber,Ta routine ne fonctionne pas chez moi : il semble que CHSPACE ignore les fenêtres. En effet, je viens de voir qu'il faut aller d'abord en visiter une. J'ai ajouté une astuce, ça a l'air de mieux tourner : (defun c:tos(/) (defun *error* (msg) (princ "\nC'est pas grave") ) (command "espaceo")(command "espacep") (sssetfirst nil) (setq ent(car(entsel))) (command "_copy" ent "" "0,0" "")(princ"\nCLIC dans la fenêtre") (command "_chspace" ent "" pause "") (command) (command "espacep") ) Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
(gile) Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 Ne fonctionne toujours pas chez moi (A2011/W7 64 bits) avec une fenêtre simple mais fonctionne avec la polyligne d'une fenêtre polygonale : Commande: TOSespaceoCommande: espacepCommande:Choix de l'objet: _copyChoix des objets: 1 trouvé(s) Choix des objets:Spécifiez le point de base ou [Déplacement/Multiple] : 0,0 Spécifiez le deuxième point ou : Régénération du modèle. Commande:CLIC dans la fenêtre_chspaceChoix des objets: 1 trouvé(s) Choix des objets: [surligneur]1 fenêtres sélectionnées ignorées[/surligneur] Choix des objets:Commande: espacepDéjà dans l'espace Papier. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 J'ai modifié la Vp2Model (CF plus haut) pour qu'elle traite aussi les fenêtres polygonales (polyligne) et je donne une autre version (vp2ms) qui n'utilise pas explicitement les matrices mais utilise 'command' pour activer et désactiver la fenêtre, ce qui peut présenter quelques désavantages. ;; Vp2Ms -Gilles Chanteau- ;; Crée une polyligne dans l'espace objet figurant une fenêtre de présentation ;; Retourne le nom d'entité de la polyligne (ENAME) ;; ;; Argument ;; vp : la fenêtre de présentation (ENAME) (defun vp2ms (vp / MakePline elst wid ht cen nor pts) (defun MakePline (pts vpId nor) (command "_.mspace") (setvar 'cvport vpId) (setq pts (mapcar (function (lambda (p) (cons 10 (trans (trans p 3 2) 2 nor))) ) pts ) ) (command "_.pspace") (entmakex (append (list '(0 . "LWPOLYLINE") '(100 . "AcDbEntity") '(410 . "Model") '(100 . "AcDbPolyline") (cons 90 (length pts)) '(70 . 1) ) pts (list (cons 210 nor)) ) ) ) (setq elst (entget vp)) (cond ((= (cdr (assoc 0 elst)) "VIEWPORT") (setq wid (/ (cdr (assoc 40 elst)) 2.) ht (/ (cdr (assoc 41 elst)) 2.) cen (cdr (assoc 10 elst)) nor (cdr (assoc 16 elst)) ) (setq pts (list (list (- (car cen) wid) (- (cadr cen) ht) (caddr cen)) (list (+ (car cen) wid) (- (cadr cen) ht) (caddr cen)) (list (+ (car cen) wid) (+ (cadr cen) ht) (caddr cen)) (list (- (car cen) wid) (+ (cadr cen) ht) (caddr cen)) ) ) (MakePline pts (cdr (assoc 69 elst)) nor) ) ((= (cdr (assoc 0 elst)) "LWPOLYLINE") (setq vp (cdr (assoc 330 elst)) nor (cdr (assoc 16 (entget vp))) ) (setq pts (mapcar (function cdr) (vl-remove-if-not (function (lambda (x) (= (car x) 10))) elst ) ) ) (MakePline pts (cdr (assoc 69 (entget vp))) nor) ) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Tramber Posté(e) le 7 septembre 2010 Posté(e) le 7 septembre 2010 Ne fonctionne toujours pas chez moi (A2011/W7 64 bits) avec une fenêtre simple mais fonctionne avec la polyligne d'une fenêtre polygonale : Oui j'avais oublié de préciser que c'était écrit pour saisir des objets de contour (poly, region,etc,...) et non des fenêtres. Bureau d'études dessin. Spécialiste Escaliers Développement - Formation ./__\. (.°=°.)
RhymOne Posté(e) le 8 septembre 2010 Auteur Posté(e) le 8 septembre 2010 Bonjour,Merci gile de te pencher sur le sujet comme d'hab t'assure.Je confirme Ceci dit, il semble qu'effectivement je fasse parti de ceux qui ont le plus creusé la question parmi les LISPeurs fréquentant les forums francophones (voire anglophones). Pour revenir à nos moutons doit-je mettre ce bout de code: (vp2model (car (entsel "\nSélectionnez une fenêtre de présentation: "))) Quelque part ???Car pour l'instant en copiant la partie vp2model ou vp2ms sa ne marche pas chez moi.. Tramber:_CHSPACE: nickeltos: bon résultat DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
(gile) Posté(e) le 8 septembre 2010 Posté(e) le 8 septembre 2010 vp2model et vp2ms ne sont pas des commandes, mais des sous routines qui peuvent être appelées depuis d'autres routines ou commandes définies en LISP toutes deux requièrent un argument : le nom d'entité d'une fenêtre de présentation ou de la polyligne liée à une fenêtre.Pour plus dee précision sur l'utilisation des sous-routine et la façon de les appeler en leur passant des arguments, voir ce sujet. En donnant ces routines, je pense avoir fait le plus gros du travail.Il suffit maintenant de les appeler depuis une commande définie en LISP (defun c:toto ...) dans laquelle l'utilisateur sera invité à sélectionner la fenêtre. Et ça c'est un exercice de débutant que je te laisse faire. Comme toute expression LISP, les expressions(vp2model (car (entsel "\nSélectionnez une fenêtre de présentation: "))) ou(vp2ms (car (entsel "\nSélectionnez une fenêtre de présentation: "))) peuvent être collées directement en ligne de commande (ou dans la console de l'éditeur VisualLISP) pour tester les fonction vp2model et vp2ms. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
RhymOne Posté(e) le 9 septembre 2010 Auteur Posté(e) le 9 septembre 2010 Autant pour moi je n'avais pas remarqué que c'eatait des sous-routines... DAO: AutoCAD(2D & 3D), CovadisCAO: 3D's MAX, Rhinoceros 3D, REVITGeoModeliSation: AutoCAD MEP, RhinoTerrainRendu: Vray for Rhino, Keyshot, LumionProgrammation: Grasshopper, Dynamo, VisualStudio C.V.Profil LinkedInBookSite web http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg
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