Aller au contenu

Corriger des poly3D au z fantaisiste ?


Messages recommandés

Posté(e)

J'ai reçu une carto un peu pourrite. La majorité des poly3D (voire toutes)qui la compose ont un pb d'altitude avec le sommet n°1.

 

Pour ce sommet le z est exactement 10x plus petit que sur les suivants (z1=200, alors qu'il devrait être = à 2000 pour une courbe de niveau par exemple).

 

Corriger manuellement serait long. Y a til un moyen rapide pour corriger ça ?

 

Il faudrait faire "x10" sur la valeur z du sommet n°1 d'un jeu de sélection de poly3D. Je suis sûr que c'est simple et que je pourrais utiliser ce cas pour commencer à apprendre le lisp, mais là je manque de temps..

 

Merci d'avance pour votre aide !

 

 

Vue isométrique de la carto :

http://img211.imageshack.us/img211/5145/cartoyh6.jpg

Formateur Autocad - Revit - Sketchup - Photoshop

Posté(e)

Salut,

(j'attends toujour ma Guiness moi...)

 

test ça :

(fait rapidement, peut-être simplifié)

 

(defun c:x10 (/ COORDZ1 COORDZ1+ I LA LB LST LST-P LST-VLA-SEL LSTCOORD SEL)

(setq sel (ssget '((0 . "POLYLINE"))))
(foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel)))
    (setq lst-vla-sel (append (list (vlax-ename->vla-object n)) lst-vla-sel))
    )

(repeat (setq i (length lst-vla-sel))
 (setq lstcoord (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates (nth (setq i (1- i)) lst-vla-sel))))
       coordz1 (nth 2 lstcoord)
coordz1+ (* [surligneur]10 [/surligneur]coordz1)
la (reverse (cdr (member coordz1 (reverse lstcoord))))
lb (cdr (member coordz1 lstcoord))
lst-p (append la (list coordz1+) lb)
lst (vla-put-Coordinates (nth i lst-vla-sel)
      (vlax-make-variant (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbDouble (cons 0 (1- (length lst-p)))) lst-p)))
)
 )
 (princ (strcat "\n" (rtos (length lst-vla-sel)) " Polyligne(s) traité(s)"))
 (princ)
 )

 

[Edité le 31/5/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Nickel merci Fred !!

Tu auras droit à une Guinness rien que pour ça ! :D :D :D

 

Pour les 2 autres précédentes, les gars ont pas répondu, alors difficile de départager...

Formateur Autocad - Revit - Sketchup - Photoshop

Posté(e)

Jai édité mon message précédent en surlignant le multiplicateur qui permet de x10 la valeur coordonnées z du point.

modifie ce chiffre si tu rencontres le même problème mais avec une valeur différente...

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Merci.

 

J'ai des objets-point Autocad (pas des blocs points topo) et je voudrais faire pareil, c'est à dire multiplier le Z du point par 10....

Formateur Autocad - Revit - Sketchup - Photoshop

Posté(e)

Le lisp est bien!

 

Mais cette opération aurait pu ce faire manuellement en peu d'opération surtout dans ce cas précis.

 

1. Isoler le calque concerné, accrochobjet inactif

2. Depuis le SCG se mettre en vue de face ou autre à 90° de la vue plane.

3.Avec la commande "ETIRER" "Capture" sélectionner les sommets à Z=(z/100)

point base manuel 0,0,0 deuxième point manuel 0,1000,0 (Y=Z dans scu courant)

4. On retourne dans le SCG c'est fini.

 

Cela à pris moins de temps que de programmer... :(

 

 

OOPS, je viens de m'apercevoir que j'avais omis un fait essentiel, l'étirement est un facteur de 100 par rapport au Z actuel.

 

Réponse nulle et mal avenue. Circuler y a rien à voir :P

 

[Edité le 31/5/2007 par bonuscad]

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

Posté(e)

et non car le Z vrai est proportionnel au z faux :

 

Za-faux=200 : je veux donc faire x10 >>> Za-vrai=2000

 

Zb-faux=185 : je veux donc faire x10 >>> Zb-vrai=1850

 

un étirement marche si la différence entre Zfaux et Zvrai est la même.

Là on a différence pour Za = étirement de 1800 et pour Zb = étirement de 1850-185=1665

L'étirement pour chaque bout de poly3D n'est pas égal.

Formateur Autocad - Revit - Sketchup - Photoshop

Posté(e)
J'ai des objets-point Autocad (pas des blocs points topo) et je voudrais faire pareil, c'est à dire multiplier le Z du point par 10....

 

il faut juste changer ce qu'il y a en gras :

(defun c:x10 (/ COORDZ1 COORDZ1+ I LA LB LST LST-P LST-VLA-SEL LSTCOORD SEL)

(setq sel (ssget '((0 . "[b]POINT[/b]"))))
(foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel)))
(setq lst-vla-sel (append (list (vlax-ename->vla-object n)) lst-vla-sel))
)

(repeat (setq i (length lst-vla-sel))
(setq lstcoord (vlax-safearray->list (vlax-variant-value (vla-get-Coordinates (nth (setq i (1- i)) lst-vla-sel))))
coordz1 (nth 2 lstcoord)
coordz1+ (* 10 coordz1)
la (reverse (cdr (member coordz1 (reverse lstcoord))))
lb (cdr (member coordz1 lstcoord))
lst-p (append la (list coordz1+) lb)
lst (vla-put-Coordinates (nth i lst-vla-sel)
(vlax-make-variant (vlax-SafeArray-fill (vlax-make-SafeArray vlax-vbDouble (cons 0 (1- (length lst-p)))) lst-p)))
)
)
(princ (strcat "\n" (rtos (length lst-vla-sel)) " Polyligne(s) traité(s)"))
(princ)
)

 

Attention : pour ces 2 lisp, si les coordonnées Z = 0, ben 0 x 10 = 0 !!!

 

[Edité le 31/5/2007 par Bred]

Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...

Posté(e)

Merci Bred je n'arrivais plus à e souvenir pour faire rapidement la liste des entités suivant une sélection.

 

En AutoLISP

 (setq sel	  (ssget "X" '((0 . "POINT")))
     lst-vla-sel nil
)
(foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel)))
 (setq lst-vla-sel (append (list n) lst-vla-sel))
)

 

Pour ne plus à avoir à rechercher cette fichu routine je la colle à la suite :) Merci encore Bred.

Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier

Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To

GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office

 

PlaquetteDeplianteMars2024.pdf

Posté(e)

(foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel)))

(setq lst-vla-sel (append (list n) lst-vla-sel))

L'inconvénient, c'est que tu passes par 4 boucles mais c'est un style sympa ;)

Perso, je préfere un activeselectionset

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Posté(e)

(setq sel (ssget "X" '((0 . "POINT")))

lst-vla-sel nil

)

(foreach n (vl-remove-if 'listp (mapcar 'cadr (ssnamex sel)))

(setq lst-vla-sel (append (list n) lst-vla-sel))

)

 

J'avais pas vu mais il y de la redondance là dedans. :P

 

Avec un (ssget "_X"), la liste ssnamex ne contient pas de liste (pas de points de sélection), le vl-remoe-if 'listp est donc inutile.

Et surtout le foreach pour constituer une liste de noms d'entités à partir d'une liste de noms d'entités ... :casstet:

 

(setq sel (ssget "X" '((0 . "POINT"))))
(setq lst-vla-sel  (mapcar 'cadr (ssnamex sel)))

C'est largement suffisant ;)

 

[Edité le 31/5/2007 par (gile)]

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

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é