Aller au contenu

Crée un cadre (en objet) suivant la fenetre de la présentation.


Messages recommandés

Posté(e)

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), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

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), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

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

Posté(e)

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 matrice

Les 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), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

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

Posté(e)

 (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

 

./__\.
(.°=°.)
Posté(e)

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), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

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

Posté(e)

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

 

./__\.
(.°=°.)
Posté(e)

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: TOS

espaceo

Commande: espacep

Commande:

Choix de l'objet: _copy

Choix 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_chspace

Choix des objets: 1 trouvé(s)

 

Choix des objets: [surligneur]1 fenêtres sélectionnées ignorées[/surligneur]

 

Choix des objets:

Commande: espacep

Déjà dans l'espace Papier.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

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

Posté(e)
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

 

./__\.
(.°=°.)
Posté(e)

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: nickel

tos: bon résultat

 

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

Posté(e)

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

Posté(e)

Autant pour moi je n'avais pas remarqué que c'eatait des sous-routines...

DAO: AutoCAD(2D & 3D), Covadis

CAO: 3D's MAX, Rhinoceros 3D, REVIT

GeoModeliSation: AutoCAD MEP, RhinoTerrain

Rendu: Vray for Rhino, Keyshot, Lumion

Programmation: Grasshopper, Dynamo, VisualStudio

 

C.V.

Profil LinkedIn

Book

Site web

 

http://nsa37.casimages.com/img/2016/09/26/160926023334168603.jpg

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 compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité