Aller au contenu

Changement d\'un point d\'insertion d\'un bloc


Messages recommandés

Posté(e)

Bonjour,

 

J'ai un petit problème au niveau du changement de point d'insertion d'un bloc.

 

J'ai un bloc (en vert), avec son point d'insertion (représenté par la croix rouge)

[surligneur] http://www.hpics.li/128c1[/surligneur]

 

 

je voudrai par une manipulation automatique changer ce point d'insertion du coin bas gauche (comme sur la 1ere image) vers le centre du bloc comme sur la 2e image:

 

[surligneur] http://www.hpics.li/230e3[/surligneur]

 

 

mon problème est que si je substitue ce bloc par un autre mais avec un point d'insertion au centre sous covadis, forcément ce point ne change pâs en coordonnée, c'est le "dessin" du bloc qui change de place, voir 3e image

 

[surligneur] http://www.hpics.li/fdeb7[/surligneur]

 

Cette manipulation est-elle possible?

 

Ou sinon est-il possible de créer automatiquement un point au centre du bloc (le logiciel calcule son centre par rapport aux cotes) sans pour autant toucher a ce bloc (donc en gardant le point d'insertion bas gauche) ?

 

merci d'avance

 

 

Posté(e)

bonsoir et bienvenue

 

tu vas utiliser la commande REFEDIT

tu choisis ton bloc

tu déplaces les entités à ta guise

tu enregistres les modifications

un message va te prévenir que toutes les occurences de ce bloc vont être modifiées

tant mieux, c'est le but

tu valides

et voilà ...

 

amicalement

Posté(e)

Bonsoir,

 

est-ce que tous les blocs ont la même taille et sont tous orientés de la même manière.

 

Si oui, alors substituer par le bon bloc et lancer la commande déplacer en entrant le déplacement entre les 2 points d'insertion.

 

Si les facteurs d'échelle te les orientations sont différentes, ça se complique.

 

Il faut un programme qui récupère les facteurs d'échelle en X et en Y, puis l'angle de rotation, enfin recalculer le point correspondant au centre du bloc et déplacer le bloc.

 

Olivier

Support Technique Covadis

Posté(e)

@ Didier: J'ai testé la fonction refedit, mais j'ai pas trouver comment changer le point d'accroche et le mettre au centre du bloc. En le déplacant, ce point ne bouge pas.

 

 

@ SupportCova: Bien sur que non ces blocs sont tous différents, taille et angle différents, ca serait bien trop facile sinon :P

 

Posté(e)

Salut,

 

Si j'ai bien compris la demande, le LISP suivant redéfinit le bloc sélectionné en déplaçant le point de base sur le centre de l'emprise du bloc et déplace toutes les références insérées en conséquence.

 

Fonctionne quels que soient les rotations et les échelles des références insérées.

 

(vl-load-com)
(or *acad* (setq *acad* (vlax-get-acad-object)))
(or *acdoc* (setq *acdoc* (vla-get-ActiveDocument *acad*)))
(or *blocks* (setq *blocks* (vla-get-Blocks *acdoc*)))
(or *layers* (setq *layers* (vla-get-Layers *acdoc*)))

;; CENBLK (gile)
;; Redéfinit le bloc sélectionné (déplacement du point de base au centre de
;; l'emprise du bloc) et déplace en conséquence toutes les références insérées.

(defun c:cenblk	(/ *error* ent bName lst disp ss n xform)

 (defun *error* (msg)
   (and msg
 (/= msg "Fonction annulée")
 (princ (strcat "\nErreur: " msg))
   )
   (and lst
 (foreach n lst
   (vla-put-Lock n :vlax-true)
 )
   )
   (vla-EndUndoMark *acdoc*)
   (princ)
 )

 (vla-StartUndoMark *acdoc*)
 (if
   (and
     (setq ent (car (entsel "\nSélectionnez un bloc: ")))
     (setq elst (entget ent))
     (= (cdr (assoc 0 elst)) "INSERT")
   )
    (progn
      (vlax-for l *layers*
 (and (= (vla-get-Lock l) :vlax-true)
      (setq lst (cons l lst))
      (vla-put-Lock l :vlax-false)
 )
      )
      (setq bName (cdr (assoc 2 elst))
     disp  (gc:MoveInsPtToCenter bName)
      )
      (ssget "_X" (list '(0 . "INSERT") (cons 2 bName)))
      (vlax-for obj (setq ss (vla-get-ActiveSelectionSet *acdoc*))
 (setq xform (gc:RefGeom (vlax-vla-object->ename obj)))
 (vla-Move obj
	   (vlax-3d-Point '(0. 0. 0.))
	   (vlax-3d-Point (mxv (car xform) disp))
 )
      )
      (vla-Delete ss)
    )
 )
 (*error* nil)
)

;; gc:MoveInsPtToCenter
;; Déplace le point de base du bloc au centre de son emprise
;; Retourne le vecteur correspondant au déplacement
;;
;; Argument : le nom du bloc

(defun gc:MoveInsPtToCenter (bName / blk minpt maxpt ptlst disp)
 (vl-load-com)
 (if (setq blk (gc:GetItem *blocks* bName))
   (progn
     (vlax-for	obj blk
(vla-GetBoundingBox obj 'minpt 'maxpt)
(setq ptlst (cons (vlax-safearray->list minpt)
		  (cons (vlax-safearray->list maxpt) ptlst)
	    )
)
     )
     (setq minpt (apply 'mapcar (cons 'min ptlst))
    maxpt (apply 'mapcar (cons 'max ptlst))
    disp  (mapcar '(lambda (x1 x2) (/ (+ x1 x2) 2.)) minpt maxpt)
     )
     (vlax-for	obj blk
(vla-Move obj
	  (vlax-3d-point disp)
	  (vlax-3d-point '(0. 0. 0.))
)
     )
   )
 )
 disp
)

;;; gc:GetItem (gile)
;;; Retourne le vla-object de l'item s'il est présent dans la collection
;;;
;;; Arguments
;;; col : la collection (vla-object)
;;; name : le nom de l'objet (string) ou son indice (entier)
;;;
;;; Retour : le vla-object ou nil

(defun gc:GetItem (col name / obj)
 (vl-catch-all-apply
   '(lambda () (setq obj (vla-item col name)))
 )
 obj
)

;; gc:RefGeom
;; Retourne une liste dont le premier élément est une matrice de transformation
;; (rotation, échelles, normale) de dimension 3X3 et le second le point
;; d'insertion de l'objet dans son "parent" (xref, bloc ou espace)

(defun gc:RefGeom (ename / elst ang norm mat)
 (setq	elst (entget ename)
ang  (cdr (assoc 50 elst))
norm (cdr (assoc 210 elst))
 )
 (list
   (setq mat
   (mxm
     (mapcar (function (lambda (v) (trans v 0 norm T)))
	     '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
     )
     (mxm
       (list (list (cos ang) (- (sin ang)) 0.0)
	     (list (sin ang) (cos ang) 0.0)
	     '(0.0 0.0 1.0)
       )
       (list (list (cdr (assoc 41 elst)) 0.0 0.0)
	     (list 0.0 (cdr (assoc 42 elst)) 0.0)
	     (list 0.0 0.0 (cdr (assoc 43 elst)))
       )
     )
   )
   )
   (mapcar
     '-
     (trans (cdr (assoc 10 elst)) norm 0)
     (mxv mat
   (cdr (assoc 10 (tblsearch "BLOCK" (cdr (assoc 2 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) (apply '+ (mapcar '* 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)
)

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

Posté(e)

Wahou!

 

bon je ne sais pas du tout comment fonctionne les LISP, mais j'ai un collègue qui connait. Je vous tiendrai au courant.

 

Merci!

Posté(e)

J'ai essayé de faire marcher le LISP,

 

en 1er lieu, je le charge "appload" puis je vais chercher le LISP (que j'avais copié/collé dans un fichier texte puis renommé en test.lsp )

le chargement se passe bien

 

mais quand je veux le lancer, je tape test dans la ligne de commande, autocad me met que cette commande est inconnue

 

 

J'ai dû mal faire quelque chose...? :casstet:

Posté(e)

Salut,

 

Le nom de la commande (ou des commandes) définie dans un LISP n'a rien à voir avec le nom du fichier.

Il est défini dans le code : c'est un nom de fonction préfixé avec c: situé après defun dans l'expression :

(defun c:cenblk ...)

 

Dans ce cas la commande est CENBLK.

 

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

Posté(e)

ok!

 

j'ai donc tapé la commande: CENBLK

 

 

je sélectionne le bloc voulu, mais j'ai un message d'erreur:

 

 

Commande: CENBLK

Sélectionnez un bloc:

Erreur: Erreur Automation Etendus nuls

 

 

  • Upvote 1
Posté(e)

Bonjour,

 

bon me revoilà, j'ai fait qlq test, et je me suis vite rendu compte que le problème venait des attributs du bloc.

J'ai testé sur un bloc carré simple, le lisp fonctionne,

le même carré mais avec des attributs, le lisp ne fonctionne plus.

 

Je pense avoir trouvé une bidouille à effectuer pour que le lisp fonctionne sur bloc avec attributs:

 

- j'ai mon fichier 1 avec mon bloc B avec attributs (le lisp ne marche pas), je vais éditer le fichier source de ce bloc, je supprime les attributs.

- j'importe ce bloc B (sans attributs)(mais qui a toujours le même nom) dans le fichier 1, autocad me demande si je veux mettre à jour la définition de ce bloc, je dis oui.

-autocad pense que tous les blocs B présent dans le fichier 1 sont désormais sans attributs (malgrés qu'ils soient toujours affichés), et le lisp marche à merveille.

 

Presque parfait :D :D

 

Merci!

 

[Edité le 15/6/2010 par bviard]

 

[Edité le 15/6/2010 par bviard]

Posté(e)

Bonjour..

 

et bien.. ca marche nickel

 

Merci beaucoup à vous 2 :) je vais gagner énormément de temps!

 

[Edité le 15/6/2010 par bviard]

  • 3 semaines après...
Posté(e)

Bonjour,

 

je up ce sujet pour demander si c'était normal avec le lisp RINS que les objets rectangulaires ont tendance à bouger un peu, par rapport aux objets carrés qui eux ne bougent pas d'un poil.

 

Merci :)

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é