Aller au contenu

Titifonky

Membres
  • Compteur de contenus

    125
  • Inscription

  • Dernière visite

Tout ce qui a été posté par Titifonky

  1. Si ta poutre a été crée à partir de la fonction "Construction soudée", tu peux utiliser la fonction "Ajuster/Prolonger" en séléctionnat ton plan de coupe à 14°
  2. Bonjour, Sur le site de Lee Mac http://www.lee-mac.com/clockwisep.html Ou sur celui de (Gile) http://gile.pagesperso-orange.fr/LISP/Vecteurs&Matrices.lsp
  3. Bon, après avoir un peu galéré et m'être dispersé, j'ai sorti un truc qui fonctionne, un peu à l'arrache. Je l'ai testé sur 200000 entité, ca prend un peu de temps mais ça passe sans bug. Le fonctionnement est simple : Decomposition de la polyligne Raccord des différents segments avec la commande Raccord Convertion des différents segments en une nouvelle polyligne (defun c:tst () (setvar "FILLETRAD" (getdist "Rayon de raccord")) (Raccorder_Polyligne (car (entsel "Selectionnez la polyligne à raccorder")) (getvar "FILLETRAD") ) ) (defun Raccorder_Polyligne (ent rayon / data pts enttmp ferme lst lstPl lent seg1 seg2 ptcomm pt1 pt2 deriv1 deriv2 ss ) ;; Nettoyage de la polyligne ;; On supprime le dernier sommet si celui ci est superposé avec le premier ;; et on la déclare fermée (and (setq data (entget ent) pts (dxf 10 data) ) (and (= (cdr (assoc 0 data)) "LWPOLYLINE") (apply 'and (mapcar (function (lambda (x1 x2) (equal x1 x2 1e-9))) (car pts) (last pts) ) ) ) (setq data (reverse data) data (remove-ele (assoc 10 data) data) data (remove-ele (assoc 40 data) data) data (remove-ele (assoc 41 data) data) data (remove-ele (assoc 42 data) data) data (reverse data) data (subst (cons 70 1) (assoc 70 data) data) ) (entmod data) ) ;; Si elle est fermée, ok ;; Si elle n'est pas fermé mais qu'elle à plus de deux sommets, ok (if (or (= (cdr (assoc 70 data)) 1) (> (length (dxf 10 (entget ent))) 2)) (progn ;; Pour éviter d'avoir des pb de raccord ;; On décale la polyligne dans les deux sens. ;; Cela permet de supprimer les segments qui disparaitront lors du raccord (setq enttmp (Courbe-Decaler ent rayon nil)) (entdel ent) (setq ent (Courbe-Decaler enttmp (* 2.0 rayon) t)) (entdel enttmp) (setq enttmp (Courbe-Decaler ent rayon nil)) (entdel ent) (setq ent enttmp data (entget ent) ferme (= (cdr (assoc 70 data)) 1) ) (setq lent (entlast)) (command "_explode" ent) (setq lent (entnext lent)) (while lent (setq lst (cons lent lst) lent (entnext lent) ) ) (setq lst (reverse lst) lstPl lst ) (mapcar (function (lambda (seg1 seg2) ;; On recherche le point (setq ptcomm (car (common-fuzz (Courbe-PtDepartPtArrive seg1) (Courbe-PtDepartPtArrive seg2) 1e-4 ) ) pt1 (Courbe-PointLePlusProche seg1 ptcomm) pt2 (Courbe-PointLePlusProche seg2 ptcomm) deriv1 (Courbe-Derivee1 seg1 (Courbe-ParamAuPoint seg1 pt1) ) deriv2 (Courbe-Derivee1 seg2 (Courbe-ParamAuPoint seg2 pt2) ) ) (if (not (colinear deriv1 deriv2 1e-5)) (progn (setq pt1 (Courbe-PointALaDistance seg1 0.1 (Courbe-Position seg1 pt1) ) pt2 (Courbe-PointALaDistance seg2 0.1 (Courbe-Position seg2 pt2) ) ) (if (not (or (zerop (apply '+ pt1)) (zerop (apply '+ pt2)))) (progn (setq ent (entlast)) (command "_fillet" (list seg1 pt1) (list seg2 pt2)) (if (not (equal ent (entlast))) (setq lstPl (cons (entlast) lstPl)) ) ) ) ) ) ) ) lst (if ferme (rot1 lst) (cdr lst) ) ) (setq ss (ssadd)) (mapcar (function (lambda (x) (ssadd x ss))) lstPl) (setvar "PEDITACCEPT" 1) (command "pedit" "m" ss "") (command "j" 0.1 "") ) ) (princ) ) ;;; =================== Sous-fonction ====================== ;; DXF ;; Retourne la liste des données associé au code dxf (defun dxf (code alst) (mapcar 'cdr (massoc code alst)) ) ;; MASSOC ;; assoc multiple, retourne toutes les clef key (defun massoc (key alst) (apply 'append (mapcar '(lambda (x) (if (= (car x) key) (list x) ) ) alst ) ) ) ;; REMOVE-ELE ;; Retourne la liste sans la première occurence de l'expression (defun remove-ele (ele lst) (if (equal ele (car lst)) (cdr lst) (cons (car lst) (remove-ele ele (cdr lst))) ) ) ;; COMMON-FUZZ ;; Comme COMMON avec une tolérance dans la comparaison (defun common-fuzz (l1 l2 fuzz) (if l1 (if (member-fuzz (car l1) l2 fuzz) (cons (car l1) (common-fuzz (cdr l1) l2 fuzz)) (common-fuzz (cdr l1) l2 fuzz) ) ) ) ;; MEMBER-FUZZ ;; Comme MEMBER avec une tolérance dans la comparaison (defun member-fuzz (expr lst fuzz) (while (and lst (not (equal (car lst) expr fuzz))) (setq lst (cdr lst)) ) lst ) ;;; ROT1 - mettre le premier élément à la fin, version simple, ;;; (rotation par un) (defun rot1 (lst) (append (cdr lst) (list (car lst)))) ;; COLINEAR (defun colinear (v1 v2 fuzz) (cond ((or (and (equal (car v1) 0 fuzz) (equal (car v2) 0 fuzz)) (and (equal (cadr v1) 0 fuzz) (equal (cadr v2) 0 fuzz)) ) t ) ((or (equal (car v1) 0 fuzz) (equal (car v2) 0 fuzz) ) nil ) (t (equal (/ (cadr v1) (car v1)) (/ (cadr v2) (car v2)) fuzz) ) ) ) ;; V2D ;; Retourne un vecteur 2D ;; ;; Arguments : un vecteur (defun v2d (l) (mapcar '+ (append l '(0.0 0.0)) '(0.0 0.0)) ) ;;; Decaler une courbe (defun Courbe-Decaler (Courbe Dist Cote) (setq Dist (* Dist (if Cote 1 -1 ) ) ) (vl-catch-all-apply 'vla-Offset (list (vlax-ename->vla-object Courbe) Dist) ) (entlast) ) ;;; Renvoi le point de depart et d'arrivé (defun Courbe-PtDepartPtArrive (Courbe) (list (V2D (vlax-curve-getStartPoint (vlax-ename->vla-object Courbe)) ) (V2D (vlax-curve-getEndPoint (vlax-ename->vla-object Courbe)) ) ) ) ;;; Renvoi le coté sur lequel se situe un point ;;; début : T ;;; fin : nil (defun Courbe-Position (Courbe Point) (if (> (Courbe-DistanceAuPoint Courbe (Courbe-PointLePlusProche Courbe Point) 't ) (* (Courbe-Longueur Courbe) 0.5) ) 'nil 't ) ) ;;; Renvoi le point le plus proche (defun Courbe-PointLePlusProche (Courbe lPoint) (V2D (vlax-curve-getClosestPointTo (vlax-ename->vla-object Courbe) lPoint ) ) ) ;;; Renvoi la longueur d'une courbe (defun Courbe-Longueur (Courbe / prop vCourbe) (setq vCourbe (vlax-ename->vla-object Courbe)) (- (vlax-curve-getDistAtParam vCourbe (vlax-curve-getEndParam vCourbe) ) (vlax-curve-getDistAtParam vCourbe (vlax-curve-getStartParam vCourbe) ) ) ) ;;; Renvoi le parametre au point donnée (defun Courbe-ParamAuPoint (Courbe Point) (vlax-curve-getParamAtPoint (vlax-ename->vla-object Courbe) Point ) ) ;;; Renvoi la derivee 1 d'une courbe (defun Courbe-Derivee1 (Courbe Param /) (V2D (vlax-curve-getFirstDeriv (vlax-ename->vla-object Courbe) Param ) ) ) ;;; Renvoi le point à la distance donnée à partir du debut ou de la fin (defun Courbe-PointALaDistance (Courbe Dist Fin) (setq Dist (if Fin Dist (- (Courbe-Longueur Courbe) Dist) ) ) (V2D (vlax-curve-getPointAtDist (vlax-ename->vla-object Courbe) Dist ) ) ) ;;; Renvoi la distance à un point donné à partir du debut ou de la fin (defun Courbe-DistanceAuPoint (Courbe Point Fin / dist) (setq dist (vlax-curve-getDistAtPoint (vlax-ename->vla-object Courbe) Point ) ) (if Fin dist (- (Courbe-Longueur Courbe) dist) ) )
  4. Ca m'ai déjà arrivé, j'en avais des dizaines. Dans ma région ils appellent ça des "bêtes d'orage". Du coup j'ai du démonter entièrement l'écran, le nettoyer et le remonter. Une petite heure de boulot avec quelques tournevis.
  5. @Didier Bien sur, Creer une polyligne contenant des arcs, creer un raccord entre deux segements d'arc. Autocad ne veux pas. Et il répond l'insolent : Impossible de raccorder les segments arcs d'une polyligne. Il faut décomposer la polyligne, faire le raccord, puis la recréer. Sinon, je crois que j'ai trouvé une solution avec un peu de calcul. Pas encore eu le temps de la tester. Je vais voir ça se we. Voici mon pseudo-code : Une petite illustration Je décale la polyligne de base de la valeur d' un rayon du raccord souhaité de chaque coté. Courbe magenta et courbe bleu Je boucle sur les sommets des deux polylignes ainsi crée et je teste si le rayon jaune partant du sommet A jusqu'au centre c1 de l'arc coupe le segment d'arc 1 et si le rayon vert du sommet A jusqu'au centre c2 de l'arc coupe le segment 2. Si c'est le cas, c'est le bon coté et je récupère le centre de mon arc, le point A, et les points de départ et d'arrivée de mon arc. Sinon, c'est le point B. Je dessine une nouvelle polyligne avec mes nouveaux points. A voir comment je peux implémenter ça. Je cherche une routine qui renvoie les infos d'un segment de polyligne, arc ou ligne, en donnant simplement le no du segment.
  6. Bonjour, Je me heurte à une petit pb et ça fait mal !!! :blink: Comme explicité dans le titre, j'essaye de faire des congés sur une polyligne contenant des arcs. La commande RACCORD ne propose pas cette fonctionnalité et renvoie un beau message d'erreur. J'ai plusieurs dizaine de milliers de polyligne à traiter, je ne me vois pas le faire à la main. Avez-vous déjà été confronté à ce pb et avez-vous une solution lisp ? J'ai déjà commencé à developper une solution mais ça bug un peu dans tous les sens, le resultat est assez aléatoire. Une idée ? Merci.
  7. C'est vrai que ça fait toujours plaisir ;) Surtout que j'ai un peu abandonné AutoCad ces derniers temps au profit de Solidworks, a part pour le traitement de fichiers en "masse" avec le lisp bien sûr. Tiens, j'ai completement oublié de mettre un lien vers ce forum, j'y vais de ce pas le crier haut et fort sur les toits, enfin sur la toile. Un article pour moi, je suis impatient de le lire !!!!!
  8. Ok, je comprends, très jolie solution. Merci pour l'explication. Pour résumer, l'élément ele qui était un des arguments de la fonction 'cons' est deplacé dans une fonction équivalente à 'cons' mais ayant comme seul argument le retour de la fonction loop, ce qui permet de différer sont évaluation à la remonté de la récursion.
  9. Je viens de tomber sur ce poste et il y a une remarque que je n'ai pas très bien compris sur l'usage du lambda : Cela veut dire que lors de l'utilisation d'un lambda dans une boucle récursive celui ci est évalué qu'au retour ?
  10. Bonjour, Je post ici un petit morceau de code pour associer un champ avec un autre objet que celui de base. Dans mes présentations, j'ai un mtext contenant un champs pointant sur l'echelle de la fenêtre. Je l'utilise pour changer la fenêtre pointée par le champs. Si ca peut aider quelqu'un. (defun c:ReassocierChamps (/ entTexte entFenetre strChamps) (vl-load-com) (setq entTexte (car (entsel "Selectionnez le texte :")) entFenetre (car (entsel "Selectionnez la fenêtre :")) ;; Recupere l'entité champs strChamps (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget (cdr (assoc 360 (entget entTexte))))))))))))) ;; Pour eviter que la fonction subst modifie le nom du champs ;; passe le premier code 330 à 1000 strChamps (subst (cons 1000 (cdr (assoc 330 strChamps))) (assoc 330 strChamps) strChamps) ;; Modifie l'entité pointée strChamps (subst (cons 330 entFenetre) (assoc 330 strChamps) strChamps) strChamps (subst (cons 331 entFenetre) (assoc 331 strChamps) strChamps) ;; Remet le code 1000 à 330 strChamps (subst (cons 330 (cdr (assoc 1000 strChamps))) (assoc 1000 strChamps) strChamps) ) ;; Met à jour l'entité (entmod strChamps) (princ) )
  11. Bonjour, Oui, c'est possible. Il suffit d’insérer un équation dans la colonne avec les deux champs. Dès que j'ai accès à SW je te fais une copie d'écran.
  12. Bonjour, Voici l'adresse d'un site où tu trouvera les principales intersections et leurs développés ici
  13. Bonjour, Il n'existe pas de développé standard pour chaque diamètre de tube, le développé dépend du diamètre du diamètre des deux tubes et de l'angle entre les deux tubes. Par contre il existe des méthodes de traçage pour obtenir les développés en fonction de tout ces paramètres.
  14. Par contre, la gestion des présentations est assez limité
  15. Bonjour, Tu peux également créer une propriété personnalisée dans ton dessin et insérer un champ dans ton bloc récupérant cette information Etienne
  16. Bonjour, Je souhaite récupérer la liste de toutes les barres contenues dans un modèle. Le problème : Si cette barre est contenu dans une "construction soudée", la nomenclature est "indivisible" donc il ne prend pas en compte la barre, à moins de mettre le style de nomenclature en "normal". Y a t-il une solution pour avoir cette liste sans modifier le style de toutes les nomenclatures de mes "construction soudé" ?
  17. Titifonky

    Problème de poids

    Bonjour, Il s'agit bien de créer une mise en plan de la partie sous-traitée. J'ai une centaine de garde-corps sur une structure. Si je les mets en référence, ça va modifier tous mes plans de garde-corps. La seule solution est de créer un sous assemblage de ma structure mais ca va compliquer les modification ultérieures. Toute la structure n'est pas sous-traitée, une partie est même existante. J'ai donc des liaisons entre la structure existante et la nouvelle qui vont sauter si je crée un sous-assemblage. Je pense que c'est quand même cette solution que je vais utiliser, elle m'évitera de bidouiller mon cartouche et mes nomenclatures. Dommage que l'on ne puisse pas avoir la masse en fonction des objets affichés.
  18. Titifonky

    Problème de poids

    Bonjour, Je suis en train de faire la mise en page d'une structure dont une partie est sous-traitée. Dans mon cartouche, j'ai un champ qui inscrit automatiquement la masse de l'assemblage. J'ai donc fait une vue de la partie à sous-traiter et masqué des éléments mais le poids ne change pas dans mon cartouche. Dans mon dessin je sélectionne ma vue correspondant à la sous-traitance ainsi que le niveau de détail. Quand je masque un élément et lance la "mise à jour des propriétés physiques" il me dit qu'il ne va prendre en compte que les éléments actif, mais dans mon cartouche la masse affiche "N/D" Si je regarde les iPropriétés de mon assemblage, la masse est bien "N/D" Y a t-il une solution à mon problème ou dois-je faire la somme de mes masses "à la main" ?
  19. Titifonky

    parcourir une selection

    Bonjour, Ou tu peux utiliser cette fonction qui retourne le jeu de sélection ss sous forme de liste (defun ss_list (ss) (if ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))) Tu peux ensuite utiliser un mapcar ou un foreach pour itérer sur chacun des élément. Etienne
  20. Bonjour, Il ne faut pas ecrire (cons 8 MAT_* ) mais (cons 8 [surligneur]"[/surligneur]MAT_*[surligneur]"[/surligneur] ) Normalement, cela fonctionne. Etienne
  21. Bonjour, Je ne connais pas AutocadMAP mais je sais qu'il existe plusieurs commandes Autocad utilisant une boîte de dialogue n'ayant pas d'équivalent en ligne de commande tel "_qselect" Donc ton problème n'a peut être pas de solution en passant par la commande "_AecPublishToMapGuide" Amicalement
  22. Bonjour, Si l'option "cycle de sélection" est activée, dans le cas ou l'on clique sur des objets superposés, une petite fenêtre s'ouvre et permet de sélectionner l'objet voulu. Voilà, c'est tout simple et bien pratique. Etienne
  23. Bonjour, J'ai eu un problème du même genre il y a quelques temps : voir ici Bonne soirée
  24. Bonjour, C'est normal, ton Lisp sélectionne toutes les occurrences de bloc dont le nom est "FOND_DE_PLAN". Dans le cas d'un bloc "normal", le nom de l'occurrence du bloc correspond bien au nom du bloc, cad "FOND_DE_PLAN" dans ta situation. Mais dans le cas d'un bloc dynamique, le nom de l'occurrence du bloc est plutôt du type "*U5". Il faudrait faire une petite modification dans le Lisp pour aller rechercher les noms des blocs dynamique liés aux occurrences que tu as sélectionnées. Je n'ai jamais travaillé avec les blocs dynamique donc je ne pourrais pas t'aider dans ce domaine. Désolé Etienne PS: Pour plus de lisibilité, peux tu mettre ton code entre les balises \[code\] \[/code\] [Edité le 13/12/2010 par Titifonky]
  25. Bonjour, Une routine trouvée sur internet http://www.cadtutor.net/forum/showthread.php?32034-Drawing-Properties (defun GetInfo(Key / sInf cPrp pVal) (vl-load-com) (setq sInf(vla-get-SummaryInfo (vla-get-ActiveDocument (vlax-get-acad-object)))) (if(vl-catch-all-error-p (vl-catch-all-apply 'vla-GetCustomByKey (list sInf Key 'pVal))) (princ(strcat "\n*** ERROR. Key '" Key "' not fouund! ")) (princ(strcat "\n" Key " = " pVal)) ) (princ) )
×
×
  • 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é