-
Compteur de contenus
406 -
Inscription
-
Dernière visite
Type de contenu
Profils
Forums
Calendrier
Blogs
Tout ce qui a été posté par chris_mtp
-
Elle est vraiment pas mal ta méthode Voici ton code modifié pour compter les entités d'un calque utile dans certains cas (if (setq ss1 (ssget "_X" (list (cons 8 lay)))) (repeat (setq n (sslength ss1)) (setq name (cdr (assoc 0 (entget (ssname ss1 (setq n (1- n)))))) lst (if (setq pair (assoc name lst)) (subst (cons name (1+ (cdr pair))) pair lst) (cons (cons name 1) lst) ) ) ) ) Il ne me reste plus que filtrer par calque les polylignes 3D fermées ou non je vais essayé et je reviens vers toi en cas de prob. Merci encore Gile
-
Merci Gile Ca marche nickel, je vais décortiquer ta méthode. John
-
Non, je me suis mal exprimé Je sais le faire de cette façon mais ca marche que si tu connais le nom de ton bloc présent dans ton dessin mais si tu ne le connais pas. J'ai fait un début de code avec (if (/= nil (setq ss2 (ssget "_X" (list (cons 8 lay) (cons 0 "INSERT"))))) (progn (setq n_blk (cdr (assoc 2 (entget (ssname ss2 0))))) (setq d 1) (while (setq ent1 (ssname ss2 d)) Mais le problème est toujours le même, la difficulté réside dans le fait que je ne connais pas le nom des blocs présents dans le calque et je ne sais pas si il y a 2 types différents,3 ou 4 ....... Je pense qu'il faut faire une sélection du type (while (setq blo (tblnext "BLOCK" (not blo))) (setq nom_bloc (cdr (assoc 2 blo))) avec la table des blocs mais ensuite ....... John
-
Par contre, une question, comment faire pour compter le nombre de bloc qui sont presents dans un calque en reperant les noms de blocs ? Je m'explique, j'ai un calque qui contient deux types de blocs, un Bloc nommé A et un bloc nommé B mais qui sont dans le même calque, comment faire pour compter les blocs qui sont nommés A et les blocs qui sont nommés B ? Je ne vois vraiment pas comment faire .... Merci par avance de votre aide John
-
Je pensais que les balises "NOT" : ou AND ou OR ne s'appliquer qu'aux polylignes pour déterminer si elles sont fermées ou non comme quoi j'ai encore beaucoup apprendre encore en Lisp Merci Gile pour ces infos, ca marche nickel John
-
Bonjour à tous, Sujet très intéressant car je suis en train de faire un lisp pour traiter une à une les entités d'une sélection. Pour ma part, j'utilise un repeat avec compteur et un (setq obj (ssname ss i)) pour accéder aux entités Par contre, je bloque un peu avec -4, AND, NOT pour vérifier qu'une polyligne 2D ou 3D est fermée ou non mais j'ai trouvé la fonction de logand (dixit Gile) pour trouver le nombre de bit du code 70 donc j'ai pu m'en sortir finalement. Tout cela en pur Lisp, le VLA, je ne le maitrise pas totalement encore. Par contre, on ne peut pas par exemple faire une sélection sur un calque défini de toutes les entités de ce même calque sauf les textes et les mtexts ? Pour l'instant, je n'ai pas trouvé l'astuce sauf en parcourant le jeu de sélection ? Bon courage wookichu John
-
Bonjour Bonuscad, Personnellement, j'utilise le gratuiciel GBEPad.exe pour supprimer les lignes vides et les espaces en début ou fin de ligne pour avoir un code concis. http://www.toocharger.com/fiches/windows/gbepad/7893.htm Bravo encore pour cette routine. John
-
Je ne vois pas pourquoi ce déreglement. Essaye de modifier les paramètres de ton style de côtes. Ferme ton dessin et réouvre le pour voir. Sinon je ne vois pas. Au fait pour la précision des côtes c'est la variable LUPREC pour compléter mon message 2 Bon WE. John
-
Salut, je pense qu'il faudrait voir du côté des variables de ton dessin si je me souviens bien AUPREC pour la précision angulaires DIMZIN pour les précisions des côtes linéaires (en lisp en tout cas pour afficher des 0 après la virgule) mais tu peux trouver tout ca dans l'aide d'Autocad John
-
[Résolu] Longueurs de segments dans un polygone
chris_mtp a répondu à un(e) sujet de pierrevigneux dans Routines LISP
Gile me semble t-il a fait une routine qui côte les segments d'un polygone ou d'une poyligne 2d et 3D non fermée, en cherchant bien dans le forum je crois seglen ou quelque chose comme çà ;;;;;; -
Bonjour pierrevigneux Je ne comprends pas bien ta demande. Les applications sont nombreuses. Dans mon cas, j'ai des parcelles qui sont composées de plusieurs lignes polylignes non jointives entre elles. J'ai, dans le cadre de mon travail, besoin de créer des polylignes fermées pour chaque parcelle. J'ai dans chacune de mes parcelles un texte qui correspond au numéro de lot, du coup je clique sur le point d'insertion de mon texte en faisant attention de bien avoir dans ma fenêtre autocad la totalité du contour de ma parcelle et la fonction _bpoly fait le reste à savoir créer une polyligne fermée de la parcelle. Après je les automatiser pour faire la liste de tous mes points d'insertion de mes textes numéro de lot et le lisp me crée toutes les parcelles concernées. Certaines des parcelles ne sont cependant pas traités mais je suis en train d'y remedier Entre parenthèses Je suis en train de travailler avec FME en ce moment sur un projet cadastral mais je butte un peu sur certaines fonctions du coup je retravaille certains de mes dessins en lisp. FME doit le faire très bien et surtout avec une rapidité supérieure au lisp mais comme tout logiciel ou language de programmation, il demande un temps de compréhension et d'adaptation... En espérant avoir répondu à ta question John
-
Bonjour à tous, Je ne connaissais pas du tout la fonction Bpoly. Merci encore de votre aide et des explications de Gile. Ca marche nickel chrome Amicalement John
-
Bonjour à tous, J'ai un fichier avec des parcelles non closes. Ces parcelles sont délimités par des lignes ou des polylignes qui se joignent mais une parcelle n'est pas représenté par une polyligne 2D fermée, ce que je souhaite réaliser. Dans toutes les parcelles se trouve un et un seul texte. J'aurai besoin d'une routine qui me sélectionne toutes les entités autour de ce texte et par la suite me tracer un polygone fermée pour créer la parcelle. Je ne vois pas comment m'y prendre car il n'existe pas sous Autocad une sélection qui s'effectue autour d'une entité du moins à ma connaissance d'où ma question ? Avez vous à disposition ce genre de routine ? Merci par avance de votre aide. John
-
Bonjour à tous, Voilà mon problème, j'insère depuis un lisp des valeurs dans des feuilles Excel qui coorespondent à des attributs, jusque là rien ne sensationnel mais là ou ca se complique, c'est que si, dans un premier temps j'ouvre un classeur, j'intègre les données puis le referme et j'ouvre dans un second temps un second classeur, j'ai le retour en ligne de commande de mon lisp erreur: type d'argument incorrect: VLA-OBJECT nil Au début de mon lisp, j'ai (if (setq ExcelApp (vlax-get-or-create-object "Excel.Application")) (progn (vlax-invoke-method (vlax-get-property ExcelApp "ActiveWorkbook") "Save") (setq wks (vlax-get ExcelApp 'Workbooks)) (setq fi_open nil) (vlax-for sel wks (setq fi_open (append fi_open (list (strcase (vlax-get sel 'fullname)))))) (setq wks1 (vlax-invoke-method (vlax-get-property ExcelApp 'WorkBooks) 'Open (nth 1 fi_open))) (setq she1 (vlax-get-property ExcelApp "ActiveSheet")) ) ) Et en fin de code quand je ferme ma boite de dialogue, j'ai (vlax-release-object ExcelApp) (gc) (gc) Tout marche nickel si je travaille dans un seul fichier Excel ouvert après l'ouverture d'Autocad mais si par malheur, je ferme mon premier classeur et j'en ouvre un autre, ca plante. De plus, je fais un (vlax-invoke-method (vlax-get-property ExcelApp "ActiveWorkbook") "Save") en début de programme car j'ai un problème pour compter le nombre de lignes dans une feuille comme si excel ne se rafraichit pas au fur et à mesure que l'on insère des données. Pour compter mes lignes, je fais (setq f_res (vlax-get-property (vlax-get wks1 'sheets) 'item "ATTRIBUTS")) (vlax-invoke-method f_res 'Activate) (setq nlig (vlax-get (vlax-get (vlax-get f_res 'usedrange) 'rows) 'count)) Tout marche nickel sauf si je veux passer d'un classeur à l'autre mais le lisp plante sur la ligne (vlax-invoke-method (vlax-get-property ExcelApp "ActiveWorkbook") "Save") quand j'ouvre un second classeur et je ne vois pas pourquoi ? Si vous avez une idée, merci encore de votre aide et Bonnes Fêtes. John
-
Bonjour à tous, J'ai une dernière question avant de clôturer ce sujet qui m'aura bien aider dans mes démarches et programmes en OpenDCL surtout avec l'aide de Tramber et Gile (merci encore à vous deux) Si je copie sur un poste le lisp où OpenDCL n'est pas installé, est ce normal que le lisp ne marche pas ? J'ai le retour à chaque fois commande OPENDCL "inconnue" en barre de commande. De plus Autocad ne semble pas en mesure de charger le fichier arx OpenDCL.18.arx ou OpenDCL.17.arx ou même encore OpenDCL.16.arx. si OpenDCL n'est pas installé sur la machine Est ce normal ? Ya t-il une dll ou une astuce pour ne pas intaller OpenDCL et se servir quand même des boites de dialogues crée par ce dernier. Pour Information, j'utilise Autocad 2008 sous XP. Merci encore de votre aide et Bonne fêtes de fin d'année. John
-
Finalement Gile, après de nombreuses prises de tête pendant toute une soirée, j'ai fais comme tu m'a dit. Par contre, je n'ai pas qu'un bouton OK dans ma boite de dialogue mais plusieurs du coup je n'ai pas de boutton qui renvoie la valeur 1 de dcl_Form_Show sinon plus rien ne marche. Merci encore. John
-
Merci Gile pour tes conseils. C'est vrai je mets peut être J'arrive avec une boite de dialogue tout simple en pur DCL comme avec OpenDCL, j'ai même réussi dans mon code mais le problème, ca me fou le souc sur d'autres contrôles si j'attribue à mon button OK la valeur 1. Je n'ai pas trop le temps de faire un code vraiment abouti. Du coup, j'ai fais un simple ButtonText qui lance un lisp avec une boite de dialogue en Pur DCL lisp et là ca marche nickel. Je vois que les contrôles des buttons et les boites de dialogues avec OpenDCL sont certes plus intéressants mais aussi un peu plus difficile à gérer. Je sais à quoi m'en tenir maintenant. Merci encore de ton aide à toi et Tramber. John.
-
Bonjour Gile Tramber Merci pour vos réponses. Gile, ton code marche nickel mais avec une boite de dialogue tout simple. Le problème, c'est que si je gère tous les évenements de chaque bouton dans ma routine principale à l'exemple de Tramber avec sa fonction defun c:TEST, j'ai peur que mon projet devienne vite une usine à gaz. Car ma boite de dialogue est constitué de plusieurs TabString contenant chacun un ou plusieurs boutons. Dans mon code lsp, j'ai fait (defun c:tmp1 (/) (setvar "CMDECHO" 0) (command "OPENDCL") (dcl_Project_Load "C:/Users/LISP AutoCAD/Lisp modif/tmp_cmd.odcl" T) (dcl_Form_Show tmp_cmd_FORM) (setvar "CMDECHO" 1) (prin1) ) puis après (defun c:tmp_cmd_FORM_OnInitialize (/ echx echy m_cmd) (dcl_ListBox_Clear tmp_cmd_FORM_LBOX1) (dcl_ListBox_AddList tmp_cmd_FORM_LBOX1 (list "Charger les DLLs utilisés" "Rendre calque courant" "Sommets Polylignes" (setq m_cmd (dcl_ListBox_SelectString tmp_cmd_FORM_LBOX1 "Sommets Polylignes")) (dcl_ComboBox_Clear tmp_cmd_FORM_CBOX1) (dcl_ComboBox_AddList tmp_cmd_FORM_CBOX1 (list "100" "125" "150" "200" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000" "7500" "10000")) (setq echx (dcl_ComboBox_SelectString tmp_cmd_FORM_CBOX1 "2500")) (dcl_ComboBox_Clear tmp_cmd_FORM_CBOX2) (dcl_ComboBox_AddList tmp_cmd_FORM_CBOX2 (list "100" "125" "150" "200" "250" "500" "1000" "1250" "1500" "2000" "2500" "5000" "7500" "10000")) (setq echy (dcl_ComboBox_SelectString tmp_cmd_FORM_CBOX2 "500")) (dcl_Control_SetText tmp_cmd_FORM_TBOX2 "0.00") ) Puis après je gère les évenements dès que l'utilisateur appuie sur un bouton (defun c:tmp_cmd_FORM_TXT401_OnClicked (/ cmd1) (setq cmd1 '("dll1" "pll" "inf1")) (dcl_Form_Close tmp_cmd_FORM) (princ (strcat "\nFonction principale : " (dcl_ListBox_GetSelectedItems tmp_cmd_FORM_LBOX1) " - " (nth (dcl_ListBox_GetCurSel tmp_cmd_FORM_LBOX1) cmd1) ) ) ) ou encore (defun c:tmp_cmd_FORM_TXT90_OnClicked (/) (dcl_Form_Close tmp_cmd_FORM) (IMP1) ) ou encore pour fermer la boite de dialogue sans aucune entrée (defun c:tmp_cmd_FORM_BUT203_OnClicked (/) (dcl_Form_Close tmp_cmd_FORM) ) Si tu me confirme donc qu'on peut utiliser à la suite de ces routines, une fonction du type (defun c:tmp_cmd_FORM_TXT102_OnClicked (/ rdi) (dcl_Form_Close tmp_cmd_FORM) (dcl_TabStrip_HideTab tmp_cmd_FORM_MENU1 1) (setq rdi (SelectText)) (dcl_Control_SetText tmp_cmd_FORM_TBOX2 rdi) (dcl_Form_Show tmp_cmd_FORM) ) Je vais trouver une autre solution où l'utilisateur devra entrer la distance lui-même. Déjà que c'est assez compliqué OpenDCL, je ne veux pas tout mettre dans ma routine principale sinon je sais que je ne vais pas m'en sortir. Donc soit il faut modifier je pense le code de la fonction c:tmp_cmd_FORM_TXT102_OnClicked, ajouter une propriété supplémentaire de la boite de dialogue soit je ne fais pas ce bouton. Merci encore de ton aide. John
-
Je ne suis certes pas un cador du lisp comme toi ou certains de ce forum mais de là à dire çà, il y a une marge... Sur ce, mon problème est effectivement J'ai essayé de prendre exemple sur ton code mais rien à faire, après la sélection du texte dans Autocad, la boite de dialogue ne se réaffiche toujours pas. Par contre, avec ce code non pas dans ma routine principale qui affiche la boite de dialogue mais à la suite (defun c:tmp_cmd_FORM_TXT102_OnClicked (/ rdi TXT102) (setq TXT102 T) (while (/= TXT102 nil) (setq TXT102 nil) (dcl_Form_Close tmp_cmd_FORM) (setq rdi (dcl_Control_SetText tmp_cmd_FORM_TBOX2 (SelectText))) (setq TXT102 T) (dcl_Form_Show tmp_cmd_FORM) ) ) La valeur s'insère bien dans le TextBox mais elle se répète à l'infini et ne s'arrête jamais. Je sais qu'il y a un pb dans mon code mais je ne vois pas comment faire. Si tu as 2min. Merci encore.
-
Bonjour Tramber Gile Tramber j'ai suivi tes conseils. Ma boite de dialogue marche bien. Au départ, au lieu d'alimenter mes combo box dans un c:tmp_cmd_FORM_OnInitialize je mettais pour chaque combo box un defun du type (defun c:tmp_cmd_FORM_CBOX1_OnDropDown (/) mes combo box et mes textbox s'affichent (avec l'une au l'autre méthode) correctement et je peux récupérer toutes les valeurs que je souhaite par : (setq val1 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX1)) (setq val2 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX2)) (setq val3 (dcl_Control_GetText tmp_cmd_FORM_TBOX1)) (setq val4 (dcl_Control_GetText tmp_cmd_FORM_TBOX2)) (setq val5 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX3)) Jusque là je n'ai pas de problème Gile Le OnInitialize c'est vrai que c'est plus propre comme code. Maintenant, j'ai un problème pour saisir un texte dans un Autocad qui correspond à une distance en texte et attribuer cette valeur à un text box. Je peux cliquer sur le bouton, je sélectionne mon texte mais le problème c'est que je ne peux pas revenir à ma boite de dialogue initiale. Je pense en effet que je dois utiliser un (defun c:tmp_cmd_FORM_TBOX2_OnEditChanged (NewValue /) ou un (defun c:tmp_cmd_FORM_TBOX2_OnDragnDropFromOther (DropPoint [as Varies] /) ) mais je ne sais pas comment. Gile j'ai vu l'aide mais je n'ai pas trouvé de solution à cette question. Merci encore de votre aide. John.
-
Tramber, Pour la valeur par défaut c'est bon j'ai pu m'en sortir dans les proprietés des combo box dans OpenDCL mais pour le bouton qui doit attribuer une valeur au TextBox et l'afficher dans ma boite de dialogue toujours pas...... Merci par avance de ton aide et celle de Gile (si vous avez 2min). John
-
Rebonjour Tramber Ca y est, j'y suis presque, j'ai pu alimenter et sortir une valeur de mes combo box et des text box avec en OpenDcl (defun c:tmp_cmd_FORM_TXT100_OnClicked (/ val1 val2 val3 val4 val5 lst_f) (setq val1 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX1)) (setq val2 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX2)) (setq val3 (dcl_Control_GetText tmp_cmd_FORM_TBOX1)) (setq val4 (dcl_Control_GetText tmp_cmd_FORM_TBOX2)) (setq val5 (dcl_ComboBox_GetEBText tmp_cmd_FORM_CBOX3)) (dcl_Form_Close tmp_cmd_FORM) (setq lst_f (list val1 val2 val3 val4 val5)) (princ lst_f) ) Maintenant j'ai deux petits problèmes et je n'arrive pas à trouver de solution même en tout essayant dans les proprietés, je n'arrive pas à attribuer une valeur par défaut à mes combo box dès l'affichage de ma boite de dialogue alors qu'en cliquant sur la même box en question, toutes les valeurs s'affichent bien. D'autre part, j'ai un bouton qui me permet normalement (par une fonction que Gile m'a fait) de sélectionner un texte dans mon dessin et je voudrais attribuder la valeur de ce texte à un TextBox, j'ai essayé avec (defun c:tmp_cmd_FORM_TXT102_OnClicked (/ rdi) (dcl_Form_Close tmp_cmd_FORM) (setq rdi (SelectText)) (dcl_Form_Show tmp_cmd_FORM) (dcl_Control_SetText tmp_cmd_FORM_TBOX2 rdi) ) Mais ca ne marche pas, Si tu as des idées, sinon c'est pas grave, je vais encore trifouiller par ci par là Merci encore de ton aide. John
-
Bonjour Tramber Désolé de te répondre tardivement mais j'étais en déplacement cette semaine. Je ne m'en sors pas. Je verrais plus cela dans le détail demain j'aurais plus de temps Merci encore de ta réponse. Je reviendrais vers toi pour de donner des nouvelles. John
-
MErci Tramber, J'ai pu m'en sortir avec tes conseils maitenant tout marche nickel. Je suis en train d'essayer de faire une COmbo BOX maintenant. Je ne trouve pas dans la fenêtre proprietés d'Open DCL où l'on met les valeurs d'entrées comme une popup list en pur Lisp ou on crée la liste avant et puis on charge la popup list avec (start_list "typf") (mapcar 'add_list ltypf) (end_list) De plus, comment faire pour extraire les données d'entrées d'un utilisateur à partir d'un Text Box ? Merci par avance de ton aide. John
-
J'ai pu trouver pour créer des Button Text sur chaque tab de ma boite de dialogue mais je ne trouve pas le moyen de lier un Button Text avec une commande lisp du type c:toto par exemple. Merci encore de votre aide. John
