Aller au contenu

bloc sur polyligne


lolobala

Messages recommandés

Bonjour à tous.

 

Voilà ma demande, je ne sais pas si c'est réalisable mais bon...qui tente rien n'a rien.

 

J'ai une polyligne 2d ouverte sur laquelle je souhaiterai insérer des blocs. (blocs identiques)

Mes 2 premiers blocs seront insérer aux extrémitées de ma polyligne.

Ensuite je souhaite diviser cette polyligne, en y insérant les mêmes blocs, à distance égal mais inférieur à 2500 mm.

Et pour compliquer la tâche, il faut que mes blocs soit perpendiculaire à la polyligne.

 

C'est peut être pas très clair...

 

J'ai essayé de repartir de lisp éxistant comme celui-ci :

http://cadxp.cadmag.info/modules.php?op=modload&name=XForum&file=viewthread&tid=20362#pid85057

 

Et aussi de MES3D et DIV3D de Gile, mais le principe est complètement différent.

Si quelqu'un à une idée, je suis preneur.

 

Merci d'avance

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Vu ce que je comprends de la demande, la commande native DIVISER ou le LISP Div3d devraient permettre de faire ce que tu veux à condition de redéfinir auparavant le bloc pivoté de 90°.

Ensuite, choisir l'option Bloc, puis Aligner avec l'objet = Oui, puis à l'invite nombre de segments, utiliser la calculatrice géométrique en mode transparent :

 

Entrez le nombre de segments: 'cal
>>>> Expression: trunc(63400/2500)+1

ne pas mettre + 1 si le nombre est divisible par 2500 (il se termine par : 0000, 2500, 5000 ou 7500)

 

ou encore une expression LISP :

Entrez le nombre de segments: (+ 1 (/ 63400 2500))

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Gile, petite question à quoi correspond 63400 ?

 

Autre chose, je pense qu'il y a un petit soucis. Quand j'utilise DIV3D et que j'utilise la calculatrice en mode transparent, en tapant >>>> Expression: trunc(63400/2500)+1 il me redemande le nombre de segment comme s'il ne prenait pas en compte la calculette.

 

Par contre la calculette marche avec le lisp DIVISER.

 

Autre question l'expression LISP, doit être inséré en dur dans le code ? ou au moment de l'exécution du lisp ? Si cest le deuxième cas, ça ne marche pas, ni dans DIV3D, ni dans DIVISER

 

 

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

63400 est un exemple, à remplacer par la longueur de ta polyligne.

 

Effectivement Div3d (qui est une commande définie en LISP) n'accepte pas directement le résultat de la calculatrice (mais le résultat est affiché en ligne de commande, il suffit de le rentrer à nouveau).

 

Avec la commande native DIVISER il n'y a aucun problème.

 

L'expression LISP remplace l'appel à la calculatrice et ne peut être utilisé qu'avec la commande native DIVISER.

 

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

C'est ce qu'il me semblait pour la valeur 63400, mais n'y aurait-il pas un moyen de procédé comme ça :

 

On lance le lisp,

On sélectionne la polyligne, (l'objet à diviser) et on récupère la variable longueur X

On sélectionne le bloc qui sera répété. Et c'est tout !

La distance entre les blocs sera de : (+1(/X 2500)).

 

Autre chose, par rapport a ma demande de départ je dois avoir un bloc au début de la polyligne mais aussi à la fin.

Lien vers le commentaire
Partager sur d’autres sites

On lance le lisp,

On sélectionne la polyligne, (l'objet à diviser) et on récupère la variable longueur X

On sélectionne le bloc qui sera répété. Et c'est tout !

 

Bien sûr que c'est faisable en LISP...

Mais tu as des demandes spécifiques de la sorte, il faudrait envisager d'apprendre ce langage ou de faire appel à un professionnel.

 

Si quelqu'un veut bien écrire ce type de routine sur un site comme CADxp, c'est qu'il y trouve son intérêt : c'est un excellent exercice pour apprendre (je l'ai beaucoup pratiqué) et, accessoirement, ça peut flatter l'ego.

 

Personnellement, insérer des blocs ou des textes le long d'une courbe ne m'intéresse plus. J'ai encore dû le faire 3 ou 4 fois avec des demandes particulières différentes depuis la semaine dernière.

Je le fais encore une fois, mais je pense que c'est la dernière...

 

;;; Getblock (gile) 03/11/07
;;; Retourne le nom du bloc entré ou choisi par l'utilisateur 
;;; dans une liste déroulante de la boite de dialogue ou depuis la boite
;;; de dialogue standard d'AutoCAD
;;; Argument : le titre (string) ou nil (défaut : "Choisir un bloc")

(defun getblock	(titre / bloc n lst tmp file what_next dcl_id nom)
 (while (setq bloc (tblnext "BLOCK" (not bloc)))
   (setq lst (cons (cdr (assoc 2 bloc)) lst)
   )
 )
 (setq	lst  (acad_strlsort
       (vl-remove-if
	 (function (lambda (n) (= (substr n 1 1) "*")))
	 lst
       )
     )
tmp  (vl-filename-mktemp "Tmp.dcl")
file (open tmp "w")
 )
 (write-line
   (strcat
     "getblock:dialog{label="
     (cond (titre (vl-prin1-to-string titre))
    ("\"Choisir un bloc\"")
     )
     ";initial_focus=\"bl\";:boxed_column{
     :row{:text{label=\"Sélectionner\";alignment=left;}
     :button{label=\">>\";key=\"sel\";alignment=right;fixed_width=true;}}
     spacer;
     :column{:button{label=\"Parcourir...\";key=\"wbl\";alignment=right;fixed_width=true;}}
     :column{:text{label=\"Nom :\";alignment=left;}}
     :edit_box{key=\"tp\";edit_width=25;}
     :popup_list{key=\"bl\";edit_width=25;}spacer;}
     spacer;
     ok_cancel;}"
   )
   file
 )
 (close file)
 (setq dcl_id (load_dialog tmp))
 (setq what_next 2)
 (while (>= what_next 2)
   (if	(not (new_dialog "getblock" dcl_id))
     (exit)
   )
   (start_list "bl")
   (mapcar 'add_list lst)
   (end_list)
   (if	(setq n	(vl-position
	  (strcase (getvar "INSNAME"))
	  (mapcar 'strcase lst)
	)
)
     (setq nom (nth n lst))
     (setq nom	(car lst)
    n	0
     )
   )
   (set_tile "bl" (itoa n))
   (action_tile "sel" "(done_dialog 5)")
   (action_tile "bl" "(setq nom (nth (atoi $value) lst))")
   (action_tile "wbl" "(done_dialog 3)")
   (action_tile "tp" "(setq nom $value) (done_dialog 4)")
   (action_tile
     "accept"
     "(setq nom (nth (atoi (get_tile \"bl\")) lst)) (done_dialog 1)"
   )
   (setq what_next (start_dialog))
   (cond
     ((= what_next 3)
      (if (setq nom (getfiled "Sélectionner un fichier" "" "dwg" 0))
 (setq what_next 1)
 (setq what_next 2)
      )
     )
     ((= what_next 4)
      (cond
 ((not (read nom))
  (setq what_next 2)
 )
 ((tblsearch "BLOCK" nom)
  (setq what_next 1)
 )
 ((findfile (setq nom (strcat nom ".dwg")))
  (setq what_next 1)
 )
 (T
  (alert (strcat "Le fichier \"" nom "\" est introuvable."))
  (setq	nom nil
	what_next 2
  )
 )
      )
     )
     ((= what_next 5)
      (if (and	(setq ent (car (entsel)))
	(= "INSERT" (cdr (assoc 0 (entget ent))))
   )
 (setq nom	 (cdr (assoc 2 (entget ent)))
       what_next 1
 )
 (setq what_next 2)
      )
     )
     ((= what_next 0)
      (setq nom nil)
     )
   )
 )
 (unload_dialog dcl_id)
 (vl-file-delete tmp)
 nom
)

(defun c:DemandeSpeciale (/ curve param blk len num inc dist space)
 (vl-load-com)
 (and
   (setq curve (car (entsel "\nSélectionnez la courbe: ")))
   (setq param (vlax-curve-getEndParam curve))
   (setq blk (getblock "Choix du bloc"))
   (setq len	(vlax-curve-getDistAtParam curve param)
  num	(/ len 2500.)
  inc	(/ len
	   (if (= (fix num) num)
	     num
	     (1+ (fix num))
	   )
	)
  dist	0.
  space	(vla-get-ModelSpace
	  (vla-get-ActiveDocument (vlax-get-acad-object))
	)
   )
   (while (      (vla-InsertBlock
space
(vlax-3d-point (vlax-curve-getPointAtDist curve dist))
blk
1.
1.
1.
(+ (angle '(0. 0. 0.)
	  (vlax-curve-getFirstDeriv
	    curve
	    (vlax-curve-getParamAtDist curve dist)
	  )
   )
   (/ pi 2.)
)
     )
     (setq dist (+ dist inc))
   )
   (vla-InsertBlock
     space
     (vlax-3d-point (vlax-curve-getEndPoint curve))
     blk
     1.
     1.
     1.
     (+ (angle '(0. 0. 0.) (vlax-curve-getFirstDeriv curve param))
 (/ pi 2.)
     )
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Bien sûr que c'est faisable en LISP...

Je me doutais que tu dirais ça...

 

Mais tu as des demandes spécifiques de la sorte, il faudrait envisager d'apprendre ce langage....

Je ne demande que ça mais, je ne trouve rien de concret sur le site. Je dirais même que trouver son bonheur la dedans, c'est pas évident....en plus je manque cruellement de temps.

Il n'y a aucun tuto, j'ai trouvé le site de Reb CAO mais c'est ennuyant de devoir payer.

 

.... ou de faire appel à un professionnel...

J'aimerai aussi mais ça ne dépend pas de moi, mon patron ne fera rien dans ce sens là, même le service informatique ne serait pas y mettre du sien. Je me retrouve seul au pied du mur.... mon seul recours est ce forum, ou il y a des choses très intéressante.

 

Personnellement, insérer des blocs ou des textes le long d'une courbe ne m'intéresse plus

Dommage, tu étais mon sauveur. Je comprend que ça puisse t'ennuyer au bout d'un moment, mais pour moi c'est la solution de faciliter. Désolé.

 

Merci encore pour ton professionnalisme et ta patience. Je m'empresse de tester ça, je te tiens au courant et je ne te dérangerai plus.

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • 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é