Aller au contenu

AzRoDoRzA

Membres
  • Compteur de contenus

    36
  • Inscription

  • Dernière visite

Tout ce qui a été posté par AzRoDoRzA

  1. Hello, Je rencontre un petit problème avec mon programme. En gros, je sélectionne une polyligne, je récupère un OD de celle-ci, puis je sélectionne un point sur mon plan et ça me créer un Mtext avec l'OD. Ca fonctionne parfaitement dans l'onglet Objet, mais dans l'onglet présentation, rien n'apparaît. J'utilise getpoint pour obtenir le point ou placer le text (que je convertit en point 3d). J'ai essayer d'utiliser la fonction "trans" mais en vain. Voici un extrait du code: (setq js (ssget (list '(0 . "LWPOLYLINE,LINE") (cons 67 (if (eq (getvar "CVPORT") 1) 1 0)) (cons 410 (if (eq (getvar "CVPORT") 1) (getvar "CTAB") "Model")) ) ) ) (setvar "TEXTSIZE" 0.4) (setq AcDoc (vla-get-ActiveDocument (vlax-get-acad-object)) Space (if (= 1 (getvar "CVPORT")) (vla-get-PaperSpace AcDoc) (vla-get-ModelSpace AcDoc) ) ) (setq obj (ssname js 0) ename (vlax-ename->vla-object obj) pr (* 0.5 (vlax-curve-getEndParam ename)) deriv (vlax-curve-getFirstDeriv ename pr) rtx (- (atan (cadr deriv) (car deriv)) (angle '(0 0 0) (getvar "UCSXDIR"))) ) (if (or (> rtx (* pi 0.5)) (< rtx (- (* pi 0.5)))) (setq rtx (+ rtx pi))) (setq pt (getpoint "\nOu voulez vous placer le texte ?")) (setq nw_obj (if(/= (ade_odgetfield (ssname js 0) "infoPoly" "typeCable" 0) nil) (vla-addMtext Space (vlax-3d-point pt) 0.0 (ade_odgetfield (ssname js 0) "infoPoly" "typeCable" 0)) ) (mapcar '(lambda (pr val) (vlax-put nw_obj pr val) ) (list 'AttachmentPoint 'Height 'DrawingDirection 'InsertionPoint 'StyleName 'Layer 'Rotation 'BackgroundFill) (list 5 (getvar "TEXTSIZE") 5 pt "Standard" calque rtx 0) ) Bon j'ai raccourci le code pour ne mettre que les informations utiles donc j'ai peut être oublié des variables, mais le plus important est là, pourquoi rien n'apparaît dans mon onglet présentation alors que dans mon onglet objet ça fonctionne parfaitement ?
  2. En fait, je récupère tout les sommets de ma polyligne, je vérifie si un bloc est attaché à un de ces sommets, si c'est le cas je récupère l'attribut "NOM_BLOC" de ce bloc en question. Et en faisant des test dans l'espace objet onglet présentation, j'ai pu remarquer que les coordonnées des polylignes était complètement différentes. C'est donc pour cela que je cherchais une solution à ce problème, et la fonction "trans" répond exactement à mes besoins, merci!
  3. Ah oui exact, donc le type d'entité c'est une polyligne et j'essaye de récupérer ces données : https://prnt.sc/ountcj Je ne peux pas passer par les code dxf car ils me retournent les coordonnées de mon onglet objet or je travaille dans l'espace objet (coordonnées complètement différentes)
  4. Hello, Petite question, c'est quoi le propertyname de "Sommet X" et "Sommet Y" ?
  5. Non non pas de problème je suis là pour apprendre! Justement, j'avais vu que je pouvais le faire avec ça mais j'ai essayé mais ça me mettait "nombre d'arguments trop importants" quand je rajoutait ce petit bout de code et donc j'ai cherché une autre solution. Et là je viens de retester et ça fonctionne, c'est à n'y rien comprendre, peut-être que j'avais oublié la double parenthèse :huh: Merci en tout cas!
  6. Bon bah voila le code qui permet d'obtenir le nombre de polyligne situé sur une polyligne (en largeur): ;nbpolep : Renvois le nombre de polylignes passant sur la largeur de la polyligne sélectionnée, nil si échoue. (defun nbpolep ( / oldosmode pol pt pt1 pt2 ep in nb) (setq oldosmode (getvar 'osmode) pol (entget (car (entsel "\n Sélectionnez une polyligne: "))) pt (cdr (assoc 10 pol));premier point ep (cdr (assoc 43 pol));largeur ) (setvar 'osmode 0) (if (> ep 0) (setq in (+ (/ ep 2) (/ ep 100));incrément légèrement supérieur à la moitié de la largeur pt1 (mapcar '(lambda (x) (- x in)) pt) pt2 (mapcar '(lambda (x) (+ x in)) pt) listPoly (ssget "_C" pt1 pt2 ) ) (princ "\nLa polyligne doit avoir une largeur") ) (setq i 0) (setq nb 0) (while(< i (sslength listPoly)) (setq isPoly (entget(ssname listPoly i))) (if(= (cdr (nth 1 isPoly)) "LWPOLYLINE") (setq nb (+ nb 1)) (prin1 "Pas une polyligne") ) (setq i (+ i 1)) ) (setq nb (- nb 1)) (setvar 'osmode oldosmode) nb ) Désolé pour la propreté je débute en Lisp
  7. C'est gentil merci! Je posterai le lisp qui prend en compte uniquement les polyligne dès que je l'aurai terminé (ça devrait pas être trop long mais on sait jamais ;) )
  8. Pas mal du tout merci! Il faut juste que je modifie le code pour ne compter que les polylignes car, à première vue, il compte aussi les blocs ^^ Mais j'ai la base c'est impeccable merci beaucoup!
  9. Ok c'est bon j'ai trouvé ^^ Le code: (defun c:searchBlocFromPoly ( / liste-sommets ent-liste n liste-sommBloc name pos1 pos2 liste value listee) (setq liste-sommets '() ent-liste (entget (car (entsel "\nChoix de la polyligne\n"))) n 0 ) ;_ Fin de setq (repeat (length ent-liste) (if (= 10 (car (nth n ent-liste))) (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets)) ) ;_ Fin de if (setq n (+ 1 n)) ) ;_ Fin de repeat (setq liste-sommets (reverse liste-sommets)) (setq i 0) (setq liste-sommBloc '()) (setq listee (ssget "_X" (list(cons 0 "insert")))) (if(/= listee nil) (while (setq name (ssname listee i)) (setq pos1 (cadr (assoc 10 (entget (ssname listee i))))) (setq pos2 (caddr (assoc 10 (entget (ssname listee i))))) (setq liste (list pos1 pos2)) (setq liste-sommBloc (append liste-sommBloc (list liste))) (if (member liste liste-sommets) (progn (setq value (getattributevalue (ssname listee i))) (prin1 value) ) ;_ Fin de progn ) ;_ Fin de if (setq i (+ i 1)) ) ;_ Fin de while ) ;_ Fin de if ) ;_ Fin de defun (defun getattributevalue (entName_bloc / enx) (if (and (setq entName_bloc (entnext entName_bloc)) (= "ATTRIB" (cdr (assoc 0 (setq enx (entget entName_bloc))))) ) ;_ Fin de and (cdr (assoc 1 (reverse enx))) (getattributevalue entName_bloc) ) ;_ Fin de if ) ;_ Fin de defun Il suffisait juste de mettre ssget dans une variable au lieu de l'appeler 15 fois ;) Bye!
  10. Hello, Bon alors ce programme fonctionne nickel.... Quand on a qu'une 20aine de bloc, mais quand on a environ 1 000 bloc (1 067 pour être exact) , le programme est très, très lent (il met environ 10 secondes à s’exécuter). Du coup je relance un peu le sujet pour savoir s'il n'y a pas moyen d'améliorer le programme pour le rendre plus rapide (instantané serait cool) ou alors une fonction qui permettrait de récupérer un objet en fonction d'un point donné. Bye!
  11. Comme le montre la photo, mes polylignes ne se superposent pas (elle superposent uniquement la polyligne orange mais elle ne la "croise" pas car elle est juste plus épaisse et l'épaisseur n'est que graphique). Du coup oui j'aimerai donc sélectionner des polylignes très proches, la solution de sélection rectangulaire n'est pas bête, je vais tester ça merci!
  12. Salut Fraid, J'avais pensé à cet idée, mais le problème c'est que même si ma polyligne est énorme, elle n'a que 2 sommet au centre des extrémité de celle-ci et donc avec ton programme, il me retourne 1 car il n'y a qu'une polyligne qui passe par ses sommets, il faudrait trouver un moyen de pouvoir lui dire "ce sommet la et ses alentours", exemple: Le sommet de ma polyligne est (25.8524 82.6763) et mon autre polyligne à son sommet en (25.7399 82.461), est-ce que c'est possible de comparer ces valeurs avec un arrondi fournis ? Du style à 0.2 près ?
  13. Bon et bien je vais me contenter d'un getkword qui demande le nombre de cable sur ces polylignes, ça fera l'affaire. Merci à vous
  14. COME: effectivement, quand je dis 3, je parle de récupérer la valeur "3" qui correspond aux nombre de polylignes qui se situe sur la polyligne orange, et oui, je cherche à faire ça en Lisp, mais si une commande existe, je pourrai l'utiliser dans mon programme :) NicoM: Ah mince.. :(
  15. Hello, Petite question, est-ce que c'est possible de récupérer le nombre de polyligne situé sur une polyligne avec une plus grosse épaisseur ? Exemple: Multiple polyligne J'aimerai récupérer le chiffre "3" car il y a 3 polylignes qui passent sur la polyligne orange. Merci bye!
  16. Dans le mile c'est exactement ce que je recherchais merci!
  17. Hello (et oui c'est encore moi), Je suis actuellement à la recherche d'un Lisp ou d'une fonction que je pourrai utiliser en lisp qui me permettrait d'affecter une nouvelle echelle annotative à mon MText (sélectionné ou fourni en paramètre). J'utilise la commande : (command "_chprop" (entlast) "" "_A" "O" "") pour rendre mon MText que je viens de créer annotatif mais ensuite j'aimerai lui attribuer des échelles automatiquement, c'est possible ? Merci :)
  18. D'accord je me pencherai dessus quand j'aurai fini mes autres lisps en cours! Bon courage pour ta semaine ;)
  19. J'ai trouvé la solution à mon problème, c'était tout bête, du coup voici mon programme compacté au max: (vl-load-com) (defun c:cuttingpoly( / pt) (setq pt (vlax-safearray->list (vlax-variant-value (vla-IntersectWith (vlax-ename->vla-object (ssname(ssget) 0) ;A adapter comme vous le souhaitez ) (vlax-ename->vla-object (ssname(ssget) 0) ;A adapter comme vous le souhaitez ) 0) ) ) ) (command "_break" "_none" ent "_none" pt "_none" "@") (COPY_DATA ent (entlast) T) ;Fonction COPY_DATA de Hyppolight ) On choisis la polyligne à couper, puis la polyligne qui viens couper notre polyligne, et ça coupe en gardant les OD de chaque coté (Merci Hyppolight pour ta fonction COPY_DATA ;) ) Je vais essayer de l'améliorer maintenant pour détecter automatiquement les polylignes qui viennent couper la polyligne sélectionnée. Je posterais aussi mon code une fois la solution trouvée. Bye!
  20. Hello, Alors j'ai testé la commande break_with, elle coupe bien la polyligne mais ne garde les OD que sur une des 2 parties coupées.. J'ai essayé de modifier un peu le code mais je ne le comprend pas trop :/ Voila pour le retour!
  21. Aha merci! Oui je ne connais pas trop les normes j'ai appris le Lisp lundi donc bon ^^ Je ferai attention la prochaine fois! ;) Bye! Edit#1 rajouter ce code avant le while sinon le programme crash s'il n'y a aucun bloc dans le plan: (if(/= (ssget "_X" (list(cons 0 "insert"))) nil) (while()...) )
  22. Comme promis, voici le code : (defun c:searchBlocFromPoly() (setq liste-sommets '() ent (car (entsel"\nChoix de la polyligne\n")) ent-liste (entget ent) n 0) (repeat (length ent-liste) (if (= 10 (car (nth n ent-liste))) (setq liste-sommets (cons (cdr (nth n ent-liste)) liste-sommets)) ) (setq n (+ 1 n)) ) (setq liste-sommets (reverse liste-sommets)) (setq i 0) (setq liste-sommBloc '()) (while (setq name (ssname(ssget "_X" (list(cons 0 "insert"))) i)) (setq pos1 (cadr(assoc 10 (entget(ssname(ssget "_X" (list(cons 0 "insert"))) i))))) (setq pos2 (caddr(assoc 10 (entget(ssname(ssget "_X" (list(cons 0 "insert"))) i))))) (setq liste (list pos1 pos2)) (setq liste-sommBloc (append liste-sommBloc (list liste))) (if(member liste liste-sommets) (progn (setq value (getattributevalue (ssname(ssget "_X" (list(cons 0 "insert"))) i))) (prin1 value) ) ) (setq i (+ i 1)) ) ) (defun getattributevalue ( entName_bloc / enx ) (if (and (setq entName_bloc (entnext entName_bloc)) (= "ATTRIB" (cdr (assoc 0 (setq enx (entget entName_bloc)))))) (cdr (assoc 1 (reverse enx))) (getattributevalue entName_bloc) ) ) Avec ce code, on choisis une polyligne et ça nous renvoie les attributs des blocs :) (Je n'ai pas testé avec plusieurs blocs par contre, et désolé pour le code pas très beau à regarder ^^ )
  23. Ma solution serait je pense de récupérer les sommet aux extrémité de ma polyligne (grâce à ton programme) puis de vérifier tout les sommets de tout les bloc dans mon plan. Ensuite, vérifier si un sommet de bloc = un sommet de polyligne, c'est que c'est attaché et donc on récupère le nom du bloc! C'est partit pour programmer!
  24. Cool merci! Je posterai la solution dès que je l'aurai trouvé :)
  25. Hello, J'aurai voulu savoir si c'était possible en Lisp de récupérer un attribut de Bloc (ex: son nom) grâce au sommet d'une polyligne. En gros, à la création de ma polyligne, ça me retourne le nom des blocs aux extrémité de celle ci. Bye!
×
×
  • 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é