Aller au contenu

VDH-Bruno

Membres
  • Compteur de contenus

    1 146
  • Inscription

  • Dernière visite

  • Jours gagnés

    20

Tout ce qui a été posté par VDH-Bruno

  1. VDH-Bruno

    filtre dans SSGET "X"

    Bonjour, Juste pour mémoire... (ssget "X" '((0 . "ARC,CIRCLE,LINE")))) A+
  2. Bonjour, rebcao: Je suis heureux que (gile) soit passé par là, comme cela a été rappelé l’algorithme "naïf" que j’avais proposé n’est pas très efficient dans le cas de gros traitement, hélas dans le temps que je m’étais fixé, je ne savais coder l’algorithme diviser pour régner… Donc sur ce point je n’ai pas de regret. ;) (gile): Merci pour le source, à l’occasion je regarderai un peu plus dans détail, je suis persuadé que je ne l’aurai pas écrit aussi brillamment. Merci également d’avoir pris la peine de reposer clairement la problématique de départ, notamment cette remarque: …quel que soit le nombre de superpositions et le sens des lignes, sur ce coup-là je me déçois d’être passé au travers de cette réflexion (vis-à-vis du code proposé à rebcao), et je te remercie pour ce subtile rappel… :) A+ Bruno
  3. Version simplifié pour ne supporter que le traitement des lignes: (defun C:Rebcao (/ ss i e l m flag AcDbLine) (defun AcDbLine (l / m) (cons (car l) (cdr (member '(100 . "AcDbLine") l)))) (and (setq ss (ssget '((0 . "LINE")))) (repeat (setq i (sslength ss)) (setq l (cons (AcDbLine (entget (ssname ss (setq i (1- i))))) l)) ) (while l (setq e (car l) m (cdr l) l nil flag nil ) (while m (or (and (equal (cdr e) (cdar m) 1.e-8) (setq flag T) (entdel (cdr (assoc -1 (car m)))) ) (setq l (cons (car m) l)) ) (setq m (cdr m)) ) (if flag (entdel (cdr (assoc -1 e))) ) ) ) (princ) ) A+ Bruno
  4. Bonjour, Si le besoin reste simple (traitement d’entité non complexe), il n’est peut-être pas nécessaire de s’attaquer au code OVERKILL. Si tes entités graphiques sont simple, on peut facilement écrire 2 ou 3 lignes de code, il suffit de faire une comparaison avec le type d’entité puis celui des codes dxf se situant à la suite du deuxième marqueur de sous classe (code dxf 100) définissant les caractéristiques graphiques de l’entité. Voilà quelques lignes de code, en espérant qu’elles répondront au besoin, (non testé en profondeur..) (defun C:DelSuperposition (/ ss i e l m flag DefGeo) (defun DefGeo (l / m) (cons (car l) (cons (cadr l) (cdr (member (assoc 100 (setq m (cdr (member '(100 . "AcDbEntity") l)))) m))) ) ) (and (setq ss (ssget)) (repeat (setq i (sslength ss)) (setq l (cons (DefGeo (entget (ssname ss (setq i (1- i))))) l))) (while l (setq e (car l) m (cdr l) l nil) (while m (or (and (equal (cdr e) (cdar m) 1.e-8) (setq flag T) (entdel (cdr (assoc -1 (car m))))) (setq l (cons (car m) l))) (setq m (cdr m)) ) (if flag (entdel (cdr (assoc -1 e))) ) (setq flag nil) ) ) (princ) ) (Ps : Le code échoue sur les entités dimensions qui génère un bloc anonyme différent dans leurs définitions, si tu veux quels soit intégré au traitement fait le savoir, je jetterais un œil dessus lorsque j’aurais un peu plus de disponibilité.. ) A+ Edit: Correction d'une coquille sur la valeur de tolérance de la fonction equal 1.e-1 -> 1.e-8
  5. Bravo, bien joué ;)
  6. Bonjour rebcao, Juste pour compléter les réponses précédentes.. Le petit extrait de l’aide sur la commande explode ou cela est spécifié , La syntaxe d’appel depuis un lisp est la suivante (du moins jusque sur 2007 après..) : (c:xplode) A+
  7. Re, A modérer car j’ai été un peu vite en besogne, suite à un ou 2 petits tests supplémentaires, je ne suis plus totalement d'accord avec ce que j’ai écrit précédemment, j’ai réussi à recréer les problèmes d’affichage avec des blocs que j’ai moi-même créer sur ma version 2007… (Maintenant que je vois les effets reste à comprendre la cause) J’ai hélas peu de temps pour me pencher sur le pourquoi du comment en ce moment, mais j’y reviendrai surement plus tard, à suivre… A+
  8. Bonjour, Sur un AutoCAD classique version 2007 rien à signaler le code fonctionne à merveille (teste effectué sur RB.LSP V2.00). Je n’ai pas eu trop le temps de creusé plus, mais je ne suis pas sur les même conclusions, pour moi le code est bon, je pense que la « blague » vient du bloc du dwg posté par notre ami Lecrabe, car il n’y a que sur le dwg teste que je reproduis le comportement que vous d’écrivez. Si j’avais plus de temps c’est dans cette direction que je creuserai en priorité… Car si j’insère dans le dessin teste mes blocs, ces derniers conçu avec un AutoCAD classique son mis à jour automatiquement à l’affichage (et vice-versa). Idem si je lance la commande Annulé seul mes blocs retrouvent leurs affichage sans lancer de regen. Je ne connais pas les applicatifs métiers mais le message d’alerte sur les Objet AEC me laisse à penser qu’ils ne sont peut-être pas étrangers à cette l’affaire. Amicalement Bruno
  9. Salut, (c:rb) A+
  10. VDH-Bruno

    entre 2 spline

    Bonjour, Une fois que tu auras décidé si tu souhaites la perpendiculaire à une spline moyenne ou à l’une des deux splines… En natif il te suffit de te faire un bloc « ligne verticale » puis avec la commande mesurer tu insères ton bloc ligne en l’alignant sur la spline sélectionné pour élever tes perpendiculaires, suivant un intervalle que tu auras spécifié. A+
  11. VDH-Bruno

    vlx

    Oui mais pas seulement, en ce qui me concerne l’intérêt est surtout de lier une boîte de dialogue .dcl au fichier .lsp A+
  12. Bonjour, Les deux marche si tu as une version fr à condition d’enlever le _ à l’option de commande AR pour ARrière version française. C’est une commande AutoCAD et non une variable système (du moins sur ma vieille version AutoCAD), la bonne syntaxe et la suivante: (command "_IMAGEFRAME" 0) Car (getcname "IMAGEFRAME") retoune "_IMAGEFRAME" ;) A+
  13. Bonjour, Plus simplement au vu des retours d’invite de ta ligne de commande, je penserai plutôt à une erreur dans la recopie des expressions lisp donnés précédemment.. En théorie si tu avais un problème avec l’option de commande le vrai message d’erreur serait par exemple : Es-tu passer par l’éditeur Vlisp, un traitement texte (si oui lequel ?), ou une saisie ou collage sur la ligne de commande ? A+
  14. Bonjour, Pour l’internalisation des commandes pas mieux que ci qui est rappelé précédemment. En ce qui concerne la traduction des options de commande, bien souvent je me sers de l’astuce suivante partagé par Patrick sur le forum CADXP : http://cadxp.com/topic/33543-les-commandes-en-anglais/page__view__findpost__p__181106 Astuce qui consiste à passer par l’aide en ligne puis dans l’adresse de l’URL changer "fra" en "enu" pour afficher la page en anglais, ce qui en général donne la syntaxe des options de commande en anglais. Cdt,
  15. Bonsoir jalna \n pour un saut de ligne. \t pour insérer une tabulation. Voilà qui devrait t'aider, sinon pour l’exemple un code tapé à la volée sur les valeurs données précédemment : (defun c:li () (alert (apply 'strcat (cons "Liste des échelles: " (apply 'append (mapcar '(lambda (ech) (vl-list* "\n\n1/" (itoa ech) " = " (apply 'append (mapcar '(lambda (unit) (list "\t" (rtos (/ 1 (cvunit ech "mm" unit)) 2 4) " xp" "\ten " unit "\n" ) ) '("mm" "cm" "m") ; liste des unitées ) ) ) ) '(10 20 50 100 200 500 1000 2000 5000) ; liste des échelles ) ) ) ) ) ) A+
  16. Bonsoir Azerty, Si tu substitue l’expression ("UCSICON" . 0) du code précédent par ("UCSICON" . 1), tu verras dans le coin inférieur gauche l’orientation du scu pour t’aider dans le signe de la valeur à entrer, si tu ne souhaites pas spécifier un point. Pour l’anecdote j’avais fait le choix de masquer l’icone du SCU pour masquer sa rotation et l’utilisation du filtre de coordonnées, en jouant avec la variable angbase et quelques autres empêchant la modification visuelle du curseur… La mystification est bluffant sur ma vieille version d’AutoCAD. Hélas avec la trame de fond (quadrillage) des versions plus récentes l’effet est beaucoup moins spectaculaire. Pour ce qu’il est possible de réaliser en dynamique avec émulation de l’accroche objet sans passer par command et PAUSE, sur ce terrain je n’irai pas défier le maître et préfère te renvoyer à la routine grosmode de (gile) avec le lien suivant http://cadxp.com/topic/22617-grread-et-osmode/page__p__122443#entry122443 Au passage sur ce même lien pense à tester DSTAR, tu verras c’est visuellement beau.. A+ Bruno
  17. Bonjour x_all 2 ou 3 petites piste de réflexion.. Ces lignes ne servent a rien dans ton code, les suivantes non plus d'ailleurs.. (command "_ucs" "_restore" "scu_init") (command "_ucs" "_delete" "scu_init") Tu as fait le choix de coder avec entmake et non command dans ton code toutes tes cordonnées récupéré le sont dans le SCG quelques soit le SCU, supprime également l’emploi de la fonction trans dans ton code et tes soucis ce résoudront d’eux même. A+ et bonne continuation. Bruno
  18. Merci pour le retour, j'ai mis à jour le code précédent suivant ta remarque. A+
  19. Bonjour Olivier, Merci pour l’info, quant à la mise à jour de ma version j’y crois pas trop, le DG à des oursins dans les poches, d’ailleurs on commence à voir des versions de Draftsight s’installer à l’essai sur certains postes (Hélas pour moi, comme c’est gratuit… Cela va s’installer durablement). A+ VDH-Bruno (Ps: Pour le reste c'est toujours avec plaisir, dans la limite de mes moyens)
  20. Salut Azerty, Visiblement l’option de rotation de la commande de base ne donnant pas complétement satisfaction, donc rapidement pour le jeu un code qui devrait satisfaire le cahier des charges de la demande suivant : ;; VDH-Bruno Rectangle par 3 points 12/12/2013 (defun c:R3PT (/ *error* p1 p2 osmode) ;; Facultatif (seulement pour un plus beau visuel) (ai_sysvar '(("CMDECHO" . 0) ("UCSICON" . 0) ("ORTHOMODE" . 0) ("UCSFOLLOW" . 0)) ) ;; Routine d'erreurs (defun *error* (msg) (and msg (/= msg "Fonction annulée") (princ (strcat "\nErreur: " msg))) (command "scu" "_p") (ai_sysvar nil) (princ) ) ;; Programme principal (if (and (setq p1 (trans (getpoint "\nSpécifiez le premier point: ") 1 0)) (setq p2 (trans (getpoint (trans p1 0 1) "\nSpécifiez le second point (rotation,longueur): " ) 1 0 ) ) ) (progn (setq osmode (getvar 'osmode)) (setvar 'osmode 0) (princ "\nSpécifiez le troisième point (hauteur): ") (command "scu" (trans p1 0 1) (trans p2 0 1) "") (command "_rectang" (trans p1 0 1) ".X" (trans p2 0 1)) (setvar 'osmode osmode) (command pause) ) ) (*error* nil) ) Avec l’accrochage aux objets visible et un rectangle dessiné dynamiquement au moment de spécifier le 3ème point ;) . A+ Edit: Oupss! A vouloir aller trop vite j'ai oublié l'invite du troisième point, code corrigé.. Edit bis: Prise en compte de la remarque avec UCSFOLLOW Edit ter: Ajouté la gestion des accrochages aux objets
  21. C’est bien vu, merci également pour cette astuce. +1 A+
  22. Bonsoir, Sur ma 2007 la fonction est désactivé (grisé dans le menu déroulant) si il n’y a pas de fichier lié dans mon dessin.. Cela doit être le cas dans le fichier sur lequel tu as testé la commande _olelinks (LIENSOLE). Pour le fichier test, je n’ai pas d’AutoCAD sous la main ce soir, si nécessaire j’essayerai demain en soirée. Sinon en attendant on peut facilement en créer un : Ouvrir un nouveau dessin et une session Excel (1 classeur avec plusieurs : Feuil1, Feuil2, Feuil3 par exemple). Sélectionner une plage de cellule dans la Feuil1, puis copier (Ctrl+C) Dans AutoCAD en espace objet, tapez COLLAGSPEC dans la boite de dialogue Collage spécial choisir Coller avec liaison puis Feuille de calcul Microsoft Excel et OK. Une fois l’entité OLE (OLE2FRAME) inséré dans le dessin, en faire plusieurs copie dans le dessin. Sélectionner un ojet OLE puis au moyen de la commande _olelinks (LIENSOLE) et du bouton Modifier la source changer la Feuil1 en Feuil2 ou Feuil3 (voir la copie d’écran du premier message pour la manip). Voilà c'est ce changement de feuille que je souhaite programmer sans passer par la commande _olelinks. En espérant avoir été un peu plus clair. A+ et merci,
  23. Bonjour Patrick_35 et merci de ta réponse, je n’ai pas encore regardé ton code, peut-être y trouverai-je mon bonheur, je ne cherche pas à lier des valeurs Excel à des valeurs AutoCAD, je veux seulement pouvoir changer par programmation la feuille Excel (ou onglet) qui est affiché dans un objet OLE du dessin. A+
  24. Bonjour à tous, Je cherche à modifié les liaisons OLE dans un dessin, dans la commande liensole/_olelinks les options n’étant pas accessible en ligne de commande, je ne peux la «macrotter» et que ce soit en Vlisp ou avec les codes DXF, je n’ai pas trouvé dans quel direction chercher, donc si quelqu’un sait me mettre sur une piste, ou un exemple serait le bienvenu.. Avant toutes choses je vais essayer d’exposer le plus clairement possible les manipulations que je cherche à automatiser. Tout d’abord le contexte de travail: j’ai un fichier dwg, dans lequel par exemple est dessiné plusieurs fiches de poteaux à réaliser toutes les fiches ont un onglet de présentation nommé comme le poteau qu'il représente : P101, P102, P103 ect.. Sur le même model, j’ai un fichier excel ou chaque onglet contient la nomenclature du poteaux (chaque onglet excel étant nommé comme l’onglet du dwg correspondant. Pendant la phase de dessin au lieu d’insérer à chaque fois l’onglet excel correspondant au dessin, je recopie plusieurs occurrences d’un objet OLE préalablement inséré, puis je modifie manuellement les liaisons au moyen de la commande _olelinks. Les manipulations que je voudrais automatiser : Je grippe (sélectionne) l’entité OLE dont je veux modifier la liaison, je lance la commande _olelinks Puis je clique sur le bouton Modifier la source… Et enfin je spécifie manuellement l’onglet (dans mon cas le numéro du poteau) que je souhaite afficher et éventuellement si besoin la plage des cellules à afficher et cela pour tous les éléments de mon projet. En résumé si quelqu’un connait en Lisp le moyen de mettre à jour une occurrence d’objet OLE préalablement gripper, en spécifiant simplement le nom de l’onglet à afficher, cela me conviendrait (car je coince sur ce point, j’ai pas encore trouvé) pour le reste je personnaliserai/optimiserai à mon environnement de travail. Merci , VDH
  25. Salut, Cela est vrai dans la routine d’origine SSTL (sélection par type de ligne), car le filtre s’effectue sur le code DXF 6, code facultatif dans la liste DXF de l’entité si celui-ci n’est pas forcé… Mais dans le cas d’une sélection par type de hachure le filtre de la fonction de sélection s’effectue sur le code DXF 2 (nom de la hachure), code toujours présent dans la définition d’une entité de type hachure, donc la ligne suivante : (setq th (list '(0 . "HATCH") (cons 2 "SOLID"))) Ne se justifie pas, et le code doit en toute logique pouvoir ce simplifier comme suit : (defun c:ssth (/ ss ent) (and (or (and (setq ss (cadr (ssgetfirst))) (= 1 (sslength ss)) (setq ent (ssname ss 0)) (= (cdr (assoc 0 (entget ent))) "HATCH") ) (and (sssetfirst nil nil) (setq ent (car (entsel))) (= (cdr (assoc 0 (entget ent))) "HATCH")) ) (sssetfirst nil (ssget "_X" (list '(0 . "HATCH") (assoc 2 (entget ent))))) ) (princ) ) A+
×
×
  • 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é