Aller au contenu

(gile)

Moderateurs
  • Compteur de contenus

    12 247
  • Inscription

  • Dernière visite

  • Jours gagnés

    209

Tout ce qui a été posté par (gile)

  1. (gile)

    Coord. Bloc Imbri.

    Salut à vous, L'algorythme me semblait plus simple en partant du bloc "enfant" et en recherchant tous le blocs dans lequel il est inséré (quelque soit le niveau d'imbrication). Cela permet à chaque fois que l'on trouve un bloc "parent" contenant le bloc "enfant" (comme composant direct ou comme comme composant imbriqué, d'ajouter les coordonnées. Pour Bred, Les coordonnées retournées par : (setq coord (cdr (assoc "Parent" (nested_coord "Enfant")))) sont les coordonnées du point de base de "Enfant" dans la définition du bloc "Parent". Pour avoir les coordonnées de ce point dans chaque référence de "Parent" insérée dans le dessin, il faut les "traduire" en fonction de paramètres d'insertion de "Parent" et les ajouter au point d'insertion de la référence (voir réponse 11).
  2. (gile)

    Coord. Bloc Imbri.

    Re, La même, en plus élégant : ;;; Nested_coord Retourne une liste dont chaque élément est du type : ;;; (Nom_du_parent Coordonnées_l'enfant_dans_le_parent) ;;; ;;; L'argument est le nom du bloc dont on recherche les coordonnées dans les ;;; blocs dans lequels il est imbriqué (quelque soit le niveau d'imbrication). ;;; ;;; L'exécution du LISP peut prendre un peu de temps si la collection est fournie. (defun nested_coord (enfant / temp_lst parent ent final_lst) ;; Dans un premier temps, la liste est constituée d'un seul élément : ;; le nom du bloc enfant et les coordonnées de son point de base. (setq temp_lst (cons (cons enfant (cdr (assoc 10 (tblsearch "BLOCK" enfant)))) temp_lst ) ) ;; On boucle sur chaque élément de la liste pour chercher dans chaque bloc de la table ;; si le bloc fait partie de ses composants. Si c'est le cas, le bloc parent est ajouté ;; en fin de liste et sera traité à son tour. (while temp_lst (setq parent (tblnext "BLOCK" T)) (while parent (setq ent (cdr (assoc -2 parent))) (while ent (if (and (= (cdr (assoc 0 (entget ent))) "INSERT") (= (cdr (assoc 2 (entget ent))) (caar temp_lst)) ) ;; Ajout du nouveau bloc "parent" en fin de liste ;; Addition des coordonnées du point d'insertion du bloc enfant dans le ;; bloc parent et des coordonnées associées au bloc enfant (setq temp_lst (reverse (cons (cons (cdr (assoc 2 parent)) (mapcar '+ (cdr (assoc 10 (entget ent))) (cdar temp_lst) ) ) (reverse temp_lst) ) ) ) ) (setq ent (entnext ent)) ) (setq parent (tblnext "BLOCK")) ) (setq final_lst (cons (car temp_lst) final_lst) temp_lst (cdr temp_lst) ) ) ;; Suppression de l'élément "enfant" de la liste (reverse (cdr (reverse final_lst))) ) Pour récupérer les coordonnées du point d'insertion du bloc "Enfant" dans une référence du bloc "Parent" insérée dans le dessin (ref_parent), on intègre d'abord les paramètres d'insertion de ref_parent (échelle et rotation) puis on traduit la somme du point d'insertion de ref_parent dans le dessin et du point de base de "Enfant" dans "Parent". ;; Coordonnées du point de base de "Enfant" dans le SCO de "Parent" (setq coord (cdr (assoc "Parent" (nested_coord "Enfant")))) ;; Traduction du point de base de "Enfant" en fonction des paramètres d'insertion de "Parent". (setq coord (list (* (car coord) (cdr (assoc 41 (entget ref_parent)))) (* (cadr coord) (cdr (assoc 42 (entget ref_parent)))) (* (caddr coord) (cdr (assoc 43 (entget ref_parent)))) ) coord (polar '(0 0 0) (+ (angle '(0 0 0) coord) (cdr (assoc 50 (entget ref_parent))) ) (distance '(0 0 0) coord) ) ) ;; Coordonnées du point de base de "Enfant" dans le SCU courant. (setq scu_coord (trans (mapcar '+ (cdr (assoc 10 (entget ref_parent))) coord ) ref_parent 1 ) ) ;; Coordonnées du point de base de "Enfant" dans le SCG. (setq scg_coord (trans (mapcar '+ (cdr (assoc 10 (entget ref_parent))) coord ) ref_parent 0 ) )
  3. (gile)

    Coord. Bloc Imbri.

    Salut, Je n'ai, en ce moment, qu'un accès limité à internet, je ne peux donc pas suivre les sujets comme d'habitude. Voici une routine qui retourne une liste contenant le nom tous les blocs dans lesquels est inséré le bloc spécifié (argument de la routine) quelque soit le niveau d'imbrication. Chaque élément de la liste est une liste contenant le nom du bloc parent et les coordonnées du bloc enfant dans le bloc parent. ;;; Nested_coord Retourne une liste dont chaque élément est du type : ;;; (Nom_du_parent Coordonnées_l'enfant_dans_le_parent) ;;; ;;; L'argument est le nom du bloc dont on recherche les coordonnées dans les ;;; blocs dans lequels il est imbriqué (quelque soit le niveau d'imbrication). ;;; ;;; L'exécution du LISP peut prendre un peu de temps si la collection est fournie. (defun nested_coord (enfant / parent ent temp_lst final_lst) ;; On boucle sur chaque bloc de la table pour chercher si le bloc "Enfant" fait ;; parti des composants (imbrication niveau 1). Si c'est le cas, le bloc "Parent" ;; et les coordonnées de "Enfant" dans "Parent" sont ajoutés à la liste. (setq parent (tblnext "BLOCK" T)) (while parent (setq ent (cdr (assoc -2 parent))) (while ent (if (and (= (cdr (assoc 0 (entget ent))) "INSERT") (= (cdr (assoc 2 (entget ent))) enfant) ) (setq temp_lst (cons (cons (cdr (assoc 2 parent)) (cdr (assoc 10 (entget ent))) ) temp_lst ) ) ) (setq ent (entnext ent)) ) (setq parent (tblnext "BLOCK")) ) ;; On boucle sur chaque élément de la liste pour chercher dans chaque bloc de la table ;; si le bloc "Parent" fait parti de ses composants. Si c'est le cas, le bloc "Aïeul" ;; est ajouté en fin de liste et sera traité à son tour ceci pour trouver tous les ;; aïeuls (imbrication tous niveaux). ;; Les coordonnées du bloc "Parent" dans le bloc "Aïeul" sont ajoutées à celles ;; associées au bloc "Parent" (while temp_lst (setq parent (tblnext "BLOCK" T)) (while parent (setq ent (cdr (assoc -2 parent))) (while ent (if (and (= (cdr (assoc 0 (entget ent))) "INSERT") (= (cdr (assoc 2 (entget ent))) (caar temp_lst)) ) ;; Ajout des nouveaux blocs "aïeuls" trouvés en fin de liste (setq temp_lst (reverse (cons (cons (cdr (assoc 2 parent)) (mapcar '+ (cdr (assoc 10 (entget ent))) (cdar temp_lst) ) ) (reverse temp_lst) ) ) ) ) (setq ent (entnext ent)) ) (setq parent (tblnext "BLOCK")) ) (setq final_lst (cons (car temp_lst) final_lst) temp_lst (cdr temp_lst) ) ) final_lst ) ;;; La liste retounée peut être utilisée comme une liste associative (respecter la casse). ;;; Pour retrouver les coordonnées du bloc nommé "Enfant" dans le bloc nommé "Parent" : (cdr (assoc "Parent" (nested_coord "Enfant"))) ;;; Si le bloc "Enfant" est inséré plusieurs fois dans le bloc "Parent", il y a une occurence ;;; dans la liste pour chaque insertion (quelque soit le niveau d'imbrication). ;;; Pour récupérer les coordonnées de toutes les insertions de "Enfant" dans "Parent" : (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) "Parent")) (nested_coord "Enfant") ) )
  4. (gile)

    Coord. Bloc Imbri.

    Pour comparaison, la même chose en VisualLISP. À noter, l'utilisation de VLAX-GET : (vlax-get ref 'InsertionPoint) retourne directement une liste contrairement à (vla-get-InsertionPoint ref) qui retourne un variant voir ce sujet. (setq ref (vlax-ename->vla-object (car (entsel)))) ;_ Réference de bloc (setq ins (vlax-get ref 'InsertionPoint)) ;_ Point d'insertion de la référence (SCG) ;; On parcourt les entités composant la définition de bloc ;; pour trouver la référence de bloc "sub_bloc" insérérée dans le bloc (vlax-for obj (vla-item (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) (vla-get-name ref) ) (if (and (= (vla-get-ObjectName obj) "AcDbBlockReference") (= (vla-get-name obj) "sub_bloc") ) (setq coord (vlax-get obj 'InsertionPoint)) ;_ Point d'insertion de "sub_bloc" dans le bloc ) ) ;; Prise en compte des échelles en X, Y et Z (setq coord (mapcar '* coord (list (vlax-get ref 'XScaleFactor) (vlax-get ref 'YScaleFactor) (vlax-get ref 'ZScaleFactor) ) ) ) ;; Prise en compte de la rotation (setq coord (polar '(0 0 0) (+ (vla-get-Rotation ref) (angle '(0 0 0) coord) ) (distance '(0 0 0) coord) ) ) ;; Coordonnées du point d'insertion de "sub_ent" dans le SCG (setq coord (mapcar '+ ins (trans coord (vlax-get ref 'Normal) 0) ) )
  5. (gile)

    Coord. Bloc Imbri.

    Bon voilà, Il faut remplacer la dernière ligne de code : ;; Coordonnées du point d'insertion de "sub_ent" dans le SCG (setq coord (mapcar '+ ins coord)) par : ;; Coordonnées du point d'insertion de "sub_ent" dans le SCG (setq coord (mapcar '+ (trans ins (cdr (assoc 210 b_lst)) 0) (trans coord (cdr (assoc 210 b_lst)) 0) ) ) qu'on peut écrire aussi : (setq coord (mapcar '+ (trans ins ref 0) (trans coord ref 0) ) )
  6. Merci pour tes propositions, mais comme il s'agit de remplacer un formateur qui s'en va, les support de cours existent déjà.
  7. (gile)

    Coord. Bloc Imbri.

    Encore une fois je suis allé un peu vite en besogne, ceci n'est valable que si la rotation est nulle et les échelles en X, Y et Z égales à 1. Pour prendre en compte ces paramètres c'est un peu moins simple, exemple : (setq ref (car (entsel))) ;_ Réference de bloc (setq b_lst (entget ref)) ;_ Liste entget de la référence (setq ins (cdr (assoc 10 b_lst))) ;_ Point d'insertion de la référence (setq bloc (tblsearch "block" (cdr (assoc 2 b_lst)))) ;_ Définition du bloc ;; On parcourt les entités composant le bloc ;; pour trouver le bloc "sub_bloc" dans bloc (setq ent (cdr (assoc -2 bloc))) (while ent (setq e_lst (entget ent)) (if (= (cdr (assoc 2 e_lst)) "sub_bloc") (setq coord (cdr (assoc 10 (entget ent)))) ;_ coordonnées de "sub_bloc" dans bloc ) (setq ent (entnext ent)) ) ;; Prise en compte des échelles en X, Y et Z (setq coord (mapcar '* coord (list (cdr (assoc 41 b_lst)) (cdr (assoc 42 b_lst)) (cdr (assoc 43 b_lst)) ) ) ) ;; Prise en compte de la rotation (setq coord (polar '(0 0 0) (+ (cdr (assoc 50 b_lst)) (angle '(0 0 0) coord) ) (distance '(0 0 0) coord) ) ) ;; Coordonnées du point d'insertion de "sub_ent" dans le SCG (setq coord (mapcar '+ ins coord)) Attention ceci ne fonctionne que dans un SCU parallèle au SCG -code 210 = (210 0.0 0.0 1.0)- pour un fonctionnement en 3D, je tatonne encore.
  8. (gile)

    Coord. Bloc Imbri.

    Salut, Effectivement les coordonnées des entités composant une définition de bloc (ce que retourne tblsearch) sont définies par rapport au point de base du bloc. Pour avoir ces coordonnées dans une référence du bloc (insérée dans le dessin) il suffit d'ajouter les coordonnées de l'entité dans le bloc aux coordonnées du point d'insertion de la référence de bloc. Pour ajouter les coordonnées de deux points on fait : (mapcar '+ pt1 pt2)
  9. (gile)

    Ajuster les lignes de cotes

    Salut, À part le faire avec les grips de la cote (facile avec des COTLIN et le mode ortho ou polaire, moins avec des COTALI) , je ne vois pas.
  10. Merci, Heureusement pour moi, il s'agit plus de dessin techinque que de géométrie descriptive, et ce, dans le cadre d'une formation professionnelle pour adultes (à priori consentants, voire motivés).
  11. Pour ce qu'il en est du "mélange des genres", je n'ai jamais (durant ma courte vie de lispeur) remarqué le moindre dysfonctionnement, mais je ne peux oublier les quelques messages de Serge Camiré (développeur émérite) disant qu'il est préférable de ne pas mélanger les (command ...) avec les (entmake ...) (entmod ...) ou les (vla-add ...), voir ce sujet
  12. Moi aussi, mais Bred voulais connaître un peut mieux le VisualLISP, c'était "pédagogique".
  13. Certes, mais ne doit-on pas se mettre au vlisp ? ;)
  14. Salut Concombre_masqué, Ton message est illisible (en tout cas chez moi) peut--être un problème de bbcode ou de smiley. [Edité le 21/7/2006 par (gile)]
  15. Salut, je t'avais donné une piste ici. Il s'agit, à la spécification du nom du bloc remplaçant, si celui-ci est entré au clavier, de vérifier si le bloc est déjà dans la collection. Si le bloc n'y est pas (c'est un wbloc = fichier .dwg), il faut spécifier le chemin vers le fichier. Une fois ce wbloc inséré dans le dessin, il sera dans la collection et on pourra l'insérer en spécifiant uniquement son nom. (setq bloc_R (getstring "\n Entrez le nom du bloc Remplaçant ou : ")) (if (= bloc_R "") ;; Si sélection à l'écran (le bloc est forcément dans la collection) : (progn (while (= bloc_R "") (setq bloc_R (ssget "_:S:E" '((0 . "INSERT")))) ) (setq bloc_R (cdr (assoc 2 (entget (ssname bloc_R 0))))) ) ;; Si un nom a été entré au clavier : (if (vl-catch-all-error-p (vl-catch-all-apply 'vla-item (list (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object)) ) bloc_R ) ) ) ;; Si le bloc n'est pas trouvé dans la collection : (setq bloc_R (findfile (strcat bloc_R ".dwg" ))) ) ) Par sécurité, il vaut mieux faire en suite : (if bloc_R ...) au cas ou (findfile ...) n'aurait pas trouvé le fichier, bloc_R serait nil. [Edité le 21/7/2006 par (gile)]
  16. Salut, Il s'agit de la syntaxe à utiliser pour créer des raccourci clavier dans la partie ACCELERATORS de ton menu .MNS. Personnellement, je pense qu'il vaut mieux faire des raccoucis du type CTRL+NUMPAD1 les touches du pavé servant à entrer des données numériques :
  17. Salut, Tu veux beaucoup de choses ... Il y a un sujet récent qui traite de copies multples, tu y trouveras des liens et un LISP (sous deux formes ici et là) Ces LISP ne sont pas aussi "intelligents" que tu le désirerais, mais si tu ne veux pas faire deux clics pour spécifier le décalage, tu peux les adapter à tes besoins.
  18. (gile)

    Copie multiple

    Par curiosité, j'ai voulu comparé la différence de temps d'exécution entre la version AutoLISP et la version VisualLISP. J'ai fait le test sur AutoCAD 2007 avec un solide 3D à copier 20 fois suivant un décalage en 3D : http://img69.imageshack.us/img69/8774/mcopyfj1.png Les valeurs données (en secondes) sont les valeurs extrèmes sur plusieurs tests. En filaire 2D : - AutoLISP : 0.2340/0.2350 - VisualLISP : 0.0460/0.0470 En changeant d'ombrage, les résultats avec VisualLISP restent les mêmes, par contre avec AutoLISP ... En Style visuel masqué 3D : - AutoLISP : 2.8910/2.9060 - VisualLISP : 0.0460/0.0470 En Style visuel réaliste : - AutoLISP : 2.6870/2.7030 - VisualLISP : 0.0460/0.0470 En style visuel conceptuel - AutoLISP : 3.1100/3.1250 - VisualLISP : 0.0460/0.0470
  19. Eh bien, moi qui doit donner mon premier cours de dessin technique et géométrie descriptive à la rentrée, je crois que j'ai du boulot si je veux me faire comprendre par des profanes :(
  20. (gile)

    Copie multiple

    Pour Patrick_35, J'avoue ne pas bien comprendre l'utilisation de CopyObject, il me semble que c'est plutôt pour copier des objets d'un document vers un autre, non ? Pour Bred, Il faut que je sois un peu "frapadingue" pour faire des jeux de sélection en VisualLISP là une simple macro (bravo Bred) fait presque le même boulot ! Je dis presque, parceque la LISP permet, avec le choix des deux points de donner une direction autre que celle de l'axe des X. Pour Bonuscad, Pour les réseaux polaires, on peut utiliser Res_hel avec un un Décalage en hauteur égal à 0. Suite à une suggestion de Tramber, la nouvelle version permet de spécifier l'angle (décrit ou entre les éléments) avec l'option référence (comme "Rotation"). Mais, je crois qu'on s'éloigne du sujet ... [Edité le 20/7/2006 par (gile)]
  21. (gile)

    Publier DWF3D = CATA

    Salut, Un petit truc : À chaque "Panneau de configuration" du "Tableau de bord" on peut associer une palette d'outil. Clic droit dans le "Panneau de configuration" >> Groupe de palettes d'outils >> cocher la palette à associer. Ensuite il suffit de cliquer sur l'icône du "Panneau de configuration" pour que la palette associée s'ouvre.
  22. (gile)

    Questions Glyphes

    Salut, La taille de glyphes n'influe en rien sur la précision du positionnement des sources de lumière. La position de la source est un point qu'on peut positionner en spécifiant ses coordonnées ou en utilisant les accrochages aux objets, on peut ausi la modifier à partir de la fenêtre de Propriétés. Pour retrouver la taille initiale de glyphes, il suffit de faire un REGEN. Si l'affichage dépend des capacités de la carte graphique, le rendu est un calcul processeur. Les résultats d'un rendu sont rarement identques à l'affichage, tous les paramètres sont pris en compte lors du rendu alors que certains ne le sont pas pour augmenter les performances de l'affichage.
  23. Je maintiens ce que j'ai dit et je pense apporter une démonstration cohérente dans la Réponse N°8, peut-être un "fort en decro" pourait confirmer (à l'aide Concombre_masqué !). Je ne sais pas ce que fait Covadis quand il fait un décalge vertical de polyligne 3D, plus précisément, comment serait décalé un segment vertical de polyligne 3D. Est-ce un décalage à proprement parler (comme décris réponse N°8) ou une copie avec déplacement vertical de la polyligne ?
  24. (gile)

    Copie multiple

    Voilà, avec la sélection et les getpoint, getint en vlisp (j'ai pas triché ;) ) (defun c:mcopy (/ AcDoc Util Space mcopySelSet pt1 pt2 nb) (vl-load-com) (defun mcopy_err (msg) (if (= msg "Fonction annulée") (princ) (princ (strcat "\nErreur: " msg)) ) (if mcopySelSet (vla-delete mcopySelSet) ) (vla-endUndoMark AcDoc) (setq *error* m:err m:err nil ) (princ) ) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Util (vla-get-Utility AcDoc) Space (if (= (getvar "CVPORT") 1) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (vla-StartUndoMark AcDoc) (setq mcopySelSet (vla-add (vla-get-SelectionSets Acdoc) "mcopySelSet" ) ) (vla-SelectOnScreen mcopySelSet) (initget 1) (setq pt1 (vla-getPoint Util nil "\nSpécifiez le décalage, premier point: " ) ) (initget 1) (setq pt2 (vla-getPoint Util pt1 "\nDeuxième point: ")) (initget 1) (setq nb (vla-getInteger Util "\nNombre d'éléments: ")) (repeat (1- nb) (vlax-for obj mcopySelSet (vla-Copy obj) (vla-move obj pt1 pt2) ) ) (vla-delete mcopySelSet) (vla-endUndoMark AcDoc) (setq *error* m:err m:err nil ) (princ) ) EDIT. : Il manquait (vla-endUndoMark AcDoc) à la fin de la routine. [Edité le 20/7/2006 par (gile)]
  25. Merci, L'article est intéressant en effet, il va bien falloir s'y mettre un jour aux reactors !
×
×
  • 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é