bviard Posté(e) le 7 juin 2010 Posté(e) le 7 juin 2010 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
didier Posté(e) le 7 juin 2010 Posté(e) le 7 juin 2010 bonsoir et bienvenue tu vas utiliser la commande REFEDITtu choisis ton bloctu déplaces les entités à ta guisetu enregistres les modificationsun message va te prévenir que toutes les occurences de ce bloc vont être modifiéestant mieux, c'est le buttu valideset voilà ... amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
SupportCova Posté(e) le 7 juin 2010 Posté(e) le 7 juin 2010 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
bviard Posté(e) le 8 juin 2010 Auteur Posté(e) le 8 juin 2010 @ 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
(gile) Posté(e) le 8 juin 2010 Posté(e) le 8 juin 2010 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
bviard Posté(e) le 8 juin 2010 Auteur Posté(e) le 8 juin 2010 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!
(gile) Posté(e) le 8 juin 2010 Posté(e) le 8 juin 2010 Regarde cette page Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bviard Posté(e) le 9 juin 2010 Auteur Posté(e) le 9 juin 2010 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:
(gile) Posté(e) le 9 juin 2010 Posté(e) le 9 juin 2010 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
bviard Posté(e) le 9 juin 2010 Auteur Posté(e) le 9 juin 2010 ok! j'ai donc tapé la commande: CENBLK je sélectionne le bloc voulu, mais j'ai un message d'erreur: Commande: CENBLKSélectionnez un bloc:Erreur: Erreur Automation Etendus nuls 1
(gile) Posté(e) le 9 juin 2010 Posté(e) le 9 juin 2010 Salut, Difficile de dire d'où ça vient avec si peu d'informations. Ce LISP fonctionne très bien chez moi sur 2007 et 2010... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
bviard Posté(e) le 9 juin 2010 Auteur Posté(e) le 9 juin 2010 Je suis sur AutoCAD map 2009 + covadis 10. Si ca ne vient pas du LISP, je vais faire d'autres tests alors.
bviard Posté(e) le 15 juin 2010 Auteur Posté(e) le 15 juin 2010 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]
Patrick_35 Posté(e) le 15 juin 2010 Posté(e) le 15 juin 2010 Salut Et avec RINS ? @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bviard Posté(e) le 15 juin 2010 Auteur Posté(e) le 15 juin 2010 Bonjour.. et bien.. ca marche nickel Merci beaucoup à vous 2 :) je vais gagner énormément de temps! [Edité le 15/6/2010 par bviard]
bviard Posté(e) le 1 juillet 2010 Auteur Posté(e) le 1 juillet 2010 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 :)
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