• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Lisp pour casser plusieurs lignes dans les points d'intersection

  • Auteur du sujet Auteur du sujet Betoniera
  • Date de début Date de début

Betoniera

Guest
Bonjour à tous.
Je suis strutturiste.
pour calculer les structures à la fois en c.a, et en quantité d'acier le modèle tridimensionnel unifilare (constitué par des lignes) dans mes programmes de calcul.
J'ai besoin que toutes les lignes soient brisées aux points d'intersection.
J'ai essayé de télécharger le pkbreak. programme de lsp du site. que le programme ne fonctionne bien que si vous brisez 2 lignes avec un seul point d'intersection.
Si les lignes sont nombreuses, le programme ne fonctionne pas et va même mal.
J'ai essayé à plusieurs reprises de mettre la main dessus sans pouvoir le réparer ou comprendre pourquoi il est faux.
La question est de quelque manière que ce soit:
vous avez, gentiment, un programme qui casse les lignes aux intersections.
S'il fonctionnait pour un châssis 3d, il serait idéal, mais je me contenterais aussi d'un programme qui fonctionne en 2d, c'est-à-dire qui brise les lignes dans les points d'intersection dans l'avion.
J'ai trouvé un programme similaire dans arx, mais maintenant j'utilise progecad qui ne supporte pas les fichiers arx.
Par conséquent, la requête porte sur le dossier lisp.
Merci d'avance pour toutes les réponses.
Bonjour à tous.
 
le fichier qui casse les lignes est "spezzalinee .lsp" (pas pkbreak.lsp comme je l'ai indiqué par erreur plus tôt).
joindre le fichier original ci-dessous
ici la liste

(pourfun c:sl ()
(setvar "cmdecho" 0)
(principal "\n sélectionne les lignes à casser...")
(setq gr-selez(sget '(0 . " ligne")))
(Sect. i 0)
(répéter (longueur gr-selez)
(Sectq eei(nom gr-selez i))
(setq pi1(cdr(assoc 10(entget eei)))))
(setq pi2(cdr(assoc 11(entget eei)))))
(setq k (+ i 1))
(répéter) i 1)
(setq eek(nom gr-selez k))
(setq pk1(cdr(assoc 10(entget eek)))))
(setq pk2(cdr(assoc 11(entget eek)))))
(si (setq pint(inters pi1 pi2 pk1 pk2))
(progrès)
(command "_break" (eval eei) pint "@")
(command "_break" (eval eek) pinte "@")
)
)
(setq k(1+ k))
)
(seq i(1+) i)
)
(principaux "\n travail accompli!")
(principal)
)
(principal) <copyright: claudio="" granuzzo="" ing.=""> "
(princ "\n tape sl pour lancer le programme. "
(principal)

ce fichier fonctionne bien pour 2 lignes, mais il ne fonctionne pas si les lignes sont multiples. J'ai essayé de le changer en planifiant une exécution répétée, mais ça ne marche pas.
Quelqu'un a une idée ? .
Bonjour à tous.</copyright:>
 

Pièces jointes

Je n'ai pas testé la liste, mais je pense que cela ne fonctionne pas parce que lorsque vous cassez une ligne, le résultat (ou les résultats, je ne suis pas sûr) change le nom de l'entité, de sorte que le lisp ne sait pas sur quel (nouveau) objet intervenir.
Vous devriez d'abord trouver le nom (ou la poignée) des nouvelles entités créées, avant de boucler la taille de l'intersection.
 
Ce que vous cherchez est assez compliqué.
J'ai un lisp qui fait cela mais utilise des commandes vl que je pense progecad ne gère pas.
Pour obtenir le résultat souhaité manuellement, vous pouvez suivre cette méthode :
1) avec la commande bpoly, créer les contours des panneaux de cadre.
2) Exploser des rectangles
3) avec surkill éliminer les doubles

Si vous voulez que le fichier lisp me contacter qu'en plus de vous l'envoyer je vais expliquer un minimum de logique de ce qu'il fait.

Au revoir.
 
Je n'ai pas testé la liste, mais je pense que cela ne fonctionne pas parce que lorsque vous cassez une ligne, le résultat (ou les résultats, je ne suis pas sûr) change le nom de l'entité, de sorte que le lisp ne sait pas sur quel (nouveau) objet intervenir.
Vous devriez d'abord trouver le nom (ou la poignée) des nouvelles entités créées, avant de boucler la taille de l'intersection.
Bonjour cristal
Merci pour la réponse.
Évidemment, j'y ai pensé et j'ai pensé à résoudre le problème en créant une nouvelle sélection pour chaque cycle afin que le programme brise les lignes dans une deuxième intersection, puis dans une troisième et ainsi de suite.
pour ce faire, j'ai mémorisé les points p1 et p2 de la sélection rectangle
comme vous le voyez ci-dessous pour un cycle de 10 fois
l'étrange chose est que ce programme fonctionne également en sélectionnant plusieurs lignes, mais il ne casse que la première.
dès la seconde, ça tourne mal.
C'est une erreur comme si un support de fermeture manquait, mais je ne suis pas sûr.
Bref, j'ai fait beaucoup de tentatives sans trouver la solution.
Bien sûr, je ne m'attends pas à ce que vous trouviez l'erreur difficile.
Je demande seulement si vous avez un programme similaire qui peut être adapté.
Bonjour.

(principal "\nselect lignes à casser...")
(compte de setq 0)
(alors que (< compter 10)
(setq p1 (point d'entrée "\nimmetti primo punto di selection")
(setq p2 (getcorner p1 "\nimmetti deuxième point de sélection "))
(setq ss3(ssget "c" p1 p2 '(0 . "ligne")))

... (ici les instructions pour briser les lignes)

(nombre de séries (+ 1 nombre)
);
 
Bonjour x11start
le fichier fonctionne dans progecad même s'il contient des instructions vl.
le problème, comme vous pouvez le voir dans le gif, est qu'il casse une ligne des deux qui se croisent, laissant l'autre tout.
Est-ce qu'avec une simple instruction vous pouvez couper l'autre aussi? .
Bref, merci.
C'est un bon programme sur lequel travailler pour obtenir le résultat.
Au revoir.
 
Je pense que le problème est ce cristal levé: une fois la ligne cassée, il change son nom, donc les solutions qui viennent à mon esprit sont:
- conserver la fenêtre de sélection stockée (par exemple, point en dessous de gauche et en haut à droite), pour refaire automatiquement la solution, qui inclut les nouvelles lignes générées par la première division
- chaque fois que vous cassez une ligne mémoriser un (en dernier) pour attraper la dernière entité créée (cette idée peut aussi ne pas fonctionner! )
- marquer les entités originales (lignes), nous mettant un code de groupe 1000 - 1001, afin de lui donner un nom unique qui reste même après leur rupture... idée encore plus science fiction et le résultat incertain!

Je me souviens qu'il y avait déjà un problème similaire, quand j'ai vu une discussion sur le forum: C'est un lisp qui sert à faire un "sel" à la polylinea qui croise une autre: voir annexes
 

Pièces jointes

  • LineJump.gif
    LineJump.gif
    182.1 KB · Affichages: 18
  • LineJump.lsp
    LineJump.lsp
    2.6 KB · Affichages: 6
J'ai trouvé une fissure de John f. uhden... mais aussi pour lui il faut lancer 2 fois le lis pour couper les lignes verticales et horizontales: voir le gif
 

Pièces jointes

  • MBreak.gif
    MBreak.gif
    354.6 KB · Affichages: 19
  • MBREAK.LSP
    MBREAK.LSP
    10.7 KB · Affichages: 21
Bonjour x11start
le programme que vous avez posté fonctionne parfaitement.
Bien sûr, vous devez le jeter 2 fois pour briser toutes les lignes, mais c'est une petite chose et ça marche.
J'ai regardé la liste, mais c'est tellement complexe que j'ai renoncé à comprendre ce qu'il fait.
il y a des instructions dans vl, mais il fonctionne sur progecad que, manifestement implémenté de nombreuses fonctions vl.
Merci beaucoup pour votre engagement à me trouver le programme
et remercie John F. uhden (américain?) qui l'a écrit.
Merci de le trouver et de le mettre à la disposition de tous.
J'ai découvert que cela fonctionne aussi pour les cadres 3D. Tant mieux.
Bonjour et félicitations à tous pour le professionnalisme.
 
Dernière édition:

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut