Author Topic: Very late tonight - can someone check the code - routine...  (Read 830 times)

0 Members and 1 Guest are viewing this topic.

ribarm

  • Gator
  • Posts: 3297
  • Marko Ribar, architect
Code - Auto/Visual Lisp: [Select]
  1. (defun c:stretch-all-vertices-polygon-lw ( / mid unit asin _chkptinside _triangcen _triangarea _centroid updatelw LM:3pcircle lw lwx ch1 ch2 ch3 lst pl pln bl bln cen mpl crl loop perc g dd ll k msg )
  2.  
  3.   (defun mid ( p1 p2 )
  4.     (mapcar (function (lambda ( a b ) (/ (+ a b) 2.0))) p1 p2)
  5.   )
  6.  
  7.   (defun unit ( v / d )
  8.     (if (not (equal (setq d (distance (list 0.0 0.0 0.0) v)) 0.0 1e-8))
  9.       (mapcar (function (lambda ( x ) (/ x d))) v)
  10.       (progn (prompt "\ncatched error in (unit) : vector strength almost none - equal 0.0...") (vl-catch-all-apply (function /) (list 1 0)))
  11.     )
  12.   )
  13.  
  14.   (defun asin ( x )
  15.     (cond
  16.       ( (equal x 1.0 1e-8) (/ pi 2.0) )
  17.       ( (equal x -1.0 1e-8) (* 3.0 (/ pi 2.0)) )
  18.       ( (and (> x 0) (equal x 0.0 1e-8)) 0.0 )
  19.       ( (and (< x 0) (equal x -0.0 1e-8)) pi )
  20.       ( (atan x (sqrt (- 1.0 (* x x)))) )
  21.     )
  22.   )
  23.  
  24.   (defun _chkptinside ( pt pl / ptn intpl )
  25.     (setq ptn (mapcar (function +) pt (list 1e+8 0.0)))
  26.     (setq intpl (mapcar (function (lambda ( a b ) (inters a b pt ptn t))) pl (append (cdr pl) (list (car pl)))))
  27.     (if (= 1 (rem (length intpl) 2))
  28.       t
  29.     )
  30.   )
  31.  
  32.   (defun _triangcen ( p1 p2 p3 )
  33.     (inters p1 (mid p2 p3) p2 (mid p1 p3) t)
  34.   )
  35.  
  36.   (defun _triangarea ( p1 p2 p3 / s d1 d2 d3 )
  37.     (mapcar (function set) '(d1 d2 d3) (mapcar (function (lambda ( a b ) (distance a b))) (list p1 p2 p3) (list p2 p3 p1)))
  38.     (setq s (/ (+ d1 d2 d3) 2.0))
  39.     (sqrt (* s (- s d1) (- s d2) (- s d3)))
  40.   )
  41.  
  42.   (defun _centroid ( pl bl / p1 p2 p3 trl cl al ar mom_x mom_y cen r )
  43.     (setq pll pl)
  44.     (while (/= (length pll) 3)
  45.       (setq p1 (car pll) p2 (cadr pll))
  46.       (foreach p3 (cddr pll)
  47.         (if (_chkptinside (mid p1 p3) pl)
  48.           (setq trl (cons (list p1 p2 p3) trl))
  49.         )
  50.       )
  51.       (setq pll (cdr pll))
  52.     )
  53.     (if (= (length pll) 3)
  54.       (setq trl (cons pll trl))
  55.     )
  56.     (if (vl-every (function zerop) bl)
  57.       (foreach tr trl
  58.         (setq cl (cons (_triangcen (setq p1 (car tr)) (setq p2 (cadr tr)) (setq p3 (caddr tr))) cl))
  59.         (setq al (cons (_triangarea p1 p2 p3) al))
  60.       )
  61.       (progn (prompt "\ncatched error in (_centroid) : picked LWPOLYLINE has arced segments (i.e. bl has some value different than 0.0)...") (setq r (vl-catch-all-apply (function /) (list 1 0))))
  62.     )
  63.     (if (not r)
  64.       (progn
  65.         (setq ar (apply (function +) al))
  66.         (setq mom_x (apply (function +) (mapcar (function (lambda ( a b ) (* a b))) (mapcar (function car) cl) al)))
  67.         (setq mom_y (apply (function +) (mapcar (function (lambda ( a b ) (* a b))) (mapcar (function cadr) cl) al)))
  68.         (setq cen (list (/ mom_x ar) (/ mom_y ar)))
  69.       )
  70.       r
  71.     )
  72.   )
  73.  
  74.   (defun updatelw ( lwx pl bl )
  75.     (if bl
  76.       (entupd (cdr (assoc -1 (entmod (mapcar (function (lambda ( a b c ) (cond ( (and (= (car a) 10) b) b ) ( (and (= (car a) 42) c) c ) ( t a)))) lwx (mapcar (function (lambda ( a / x ) (if (= (car a) 10) (progn (setq x (cons 10 (car pl))) (setq pl (cdr pl)) x)))) lwx) (mapcar (function (lambda ( a / x ) (if (= (car a) 42) (progn (setq x (cons 42 (car bl))) (setq bl (cdr bl)) x)))) lwx))))))
  77.       (entupd (cdr (assoc -1 (entmod (mapcar (function (lambda ( a b ) (if (and (= (car a) 10) b) b a))) lwx (mapcar (function (lambda ( a / x ) (if (= (car a) 10) (progn (setq x (cons 10 (car pl))) (setq pl (cdr pl)) x)))) lwx))))))
  78.     )
  79.   )
  80.  
  81.   ;; 3-Point Circle  -  Lee Mac
  82.   ;; Returns the center (UCS) and radius of the circle defined by three supplied points (UCS).
  83.  
  84.   (defun LM:3pcircle ( pt1 pt2 pt3 / cen md1 md2 vc1 vc2 )
  85.     (if
  86.       (and
  87.         (setq md1 (mid pt1 pt2))
  88.         (setq md2 (mid pt2 pt3))
  89.         (setq vc1 (mapcar (function -) pt2 pt1))
  90.         (setq vc2 (mapcar (function -) pt3 pt2))
  91.         (setq cen (inters md1 (mapcar (function +) md1 (list (- (cadr vc1)) (car vc1)))
  92.                           md2 (mapcar (function +) md2 (list (- (cadr vc2)) (car vc2)))
  93.                           nil
  94.                   )
  95.         )
  96.       )
  97.       (list cen (distance cen pt1))
  98.     )
  99.   )
  100.  
  101.   (if (and (setq lw (car (entsel "\nPick CLOSED POLYGONAL LWPOLYLINE on unlocked layer..."))) (setq lwx (entget lw)) (= (cdr (assoc 0 lwx)) "LWPOLYLINE") (= 1 (logand 1 (cdr (assoc 70 lwx)))) (/= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 lwx))))))) (vl-every (function (lambda ( x ) (equal x (cons 42 0.0)))) (vl-remove-if (function (lambda ( x ) (/= (car x) 42))) lwx)))
  102.     (progn
  103.       (initget "Straight Arced")
  104.       (setq ch1 (getkword "\nChoose option - keep current straightness or turn all to arced shape [Straight/Arced] <Straight> : "))
  105.       (if (not ch1)
  106.         (setq ch1 "Straight")
  107.       )
  108.       (initget "Percent Distance")
  109.       (setq ch2 (getkword "\nChoose option - stretch method [Percent/Distance] <Percent> : "))
  110.       (if (not ch2)
  111.         (setq ch2 "Percent")
  112.       )
  113.       (initget "Centroid Basepoint")
  114.       (setq ch3 (getkword "\nChoose option - use Centroid of LWPOLYLINE or pick Center base point [Centroid/Basepoint] <Centroid> : "))
  115.       (if (not ch3)
  116.         (setq ch3 "Centroid")
  117.       )
  118.       (setq msg "left mouse click to finish, increase percentage : > ; decrease percentage : < ;; speed : 1,2,3,4,5,6,7,8,9...")
  119.       (setq lst (mapcar (function cdr) (vl-remove-if-not (function (lambda ( x ) (vl-position (car x) (list 10 42)))) lwx)))
  120.       (setq pl (vl-remove-if (function numberp) lst))
  121.       (setq bl (vl-remove-if-not (function numberp) lst))
  122.       (if (= ch3 "Centroid")
  123.         (setq cen (_centroid pl bl))
  124.         (progn (initget 1) (setq cen (trans (getpoint "\nPick or specify Center base point : ") 1 lw)))
  125.       )
  126.       (setq mpl (mapcar (function (lambda ( a b ) (mid a b))) pl (append (cdr pl) (list (car pl)))))
  127.       (if (= ch1 "Straight")
  128.         (if (= ch2 "Percent")
  129.           (progn
  130.             (setq loop 1)
  131.             (setq perc 100.0)
  132.             (prompt (strcat "\n" msg "\n"))
  133.             (prompt "\nPercent : ") (princ (rtos perc 2 20))
  134.             (while (/= (car (setq g (grread))) 3)
  135.               (if (and (= (car g) 2) (< 48 (cadr g) 58))
  136.                 (progn
  137.                   (setq loop (- (cadr g) 48))
  138.                   (prompt "\nSpeed : ") (princ loop)
  139.                 )
  140.                 (progn
  141.                   (prompt (strcat "\n" msg))
  142.                   (repeat loop
  143.                     (cond
  144.                       ( (equal g (list 2 60))
  145.                         (setq perc (- perc (* loop 0.1)))
  146.                       )
  147.                       ( (equal g (list 2 62))
  148.                         (setq perc (+ perc (* loop 0.1)))
  149.                       )
  150.                     )
  151.                     (prompt "\nPercent : ") (princ (rtos perc 2 20))
  152.                     (updatelw lwx (mapcar (function (lambda ( p ) (mapcar (function +) cen (mapcar (function (lambda ( vc ) (* vc (/ perc 100.0)))) (mapcar (function -) p cen))))) pl) nil)
  153.                   )
  154.                 )
  155.               )
  156.             )
  157.           )
  158.           (progn
  159.             (setq dd
  160.               (cond
  161.                 ( (initget 6) )
  162.                 ( (setq dd (getdist "\nPick or specify delta step distance <1.0> : ")) )
  163.                 ( t 1.0 )
  164.               )
  165.             )
  166.             (setq loop 1 ll 0.0 k 0)
  167.             (prompt (strcat "\n" msg "\n"))
  168.             (prompt "\nDistribution of delta distances : ") (princ k)
  169.             (prompt "\nDelta step distance : ") (princ (rtos dd 2 20)) (prompt "\rTotal delta distances applied : ") (princ (rtos (* dd k) 2 20))
  170.             (while (/= (car (setq g (grread))) 3)
  171.               (if (and (= (car g) 2) (< 48 (cadr g) 58))
  172.                 (progn
  173.                   (setq loop (- (cadr g) 48))
  174.                   (prompt "\nSpeed : ") (princ loop)
  175.                 )
  176.                 (progn
  177.                   (prompt (strcat "\n" msg))
  178.                   (repeat loop
  179.                     (cond
  180.                       ( (equal g (list 2 60))
  181.                         (setq ll (- ll (* loop dd)) k (- k loop))
  182.                       )
  183.                       ( (equal g (list 2 62))
  184.                         (setq ll (+ ll (* loop dd)) k (+ k loop))
  185.                       )
  186.                     )
  187.                     (prompt "\nDistribution of delta distances : ") (princ k)
  188.                     (prompt "\nDelta step distance : ") (princ (rtos dd 2 20)) (prompt "\rTotal delta distances applied : ") (princ (rtos (* dd k) 2 20))
  189.                     (updatelw lwx (mapcar (function (lambda ( p ) (mapcar (function +) cen (mapcar (function (lambda ( vc ) (* vc (+ (distance (list 0.0 0.0 0.0) (mapcar (function -) p cen)) ll)))) (unit (mapcar (function -) p cen)))))) pl) nil)
  190.                   )
  191.                 )
  192.               )
  193.             )
  194.           )
  195.         )
  196.         (if (= ch2 "Percent")
  197.           (progn
  198.             (setq loop 1)
  199.             (setq perc 100.0)
  200.             (prompt (strcat "\n" msg "\n"))
  201.             (prompt "\nPercent : ") (princ (rtos perc 2 20))
  202.             (while (/= (car (setq g (grread))) 3)
  203.               (if (and (= (car g) 2) (< 48 (cadr g) 58))
  204.                 (progn
  205.                   (setq loop (- (cadr g) 48))
  206.                   (prompt "\nSpeed : ") (princ loop)
  207.                 )
  208.                 (progn
  209.                   (prompt (strcat "\n" msg))
  210.                   (repeat loop
  211.                     (cond
  212.                       ( (equal g (list 2 60))
  213.                         (setq perc (- perc (* loop 0.1)))
  214.                       )
  215.                       ( (equal g (list 2 62))
  216.                         (setq perc (+ perc (* loop 0.1)))
  217.                       )
  218.                     )
  219.                     (setq pln (mapcar (function (lambda ( p ) (mapcar (function +) cen (mapcar (function (lambda ( vc ) (* vc (/ perc 100.0)))) (mapcar (function -) p cen))))) pl))
  220.                     (if (= perc 100.0)
  221.                       (setq bln nil)
  222.                       (progn
  223.                         (setq crl (mapcar (function (lambda ( p1 p2 p3 ) (LM:3pcircle p1 p2 p3))) pln mpl (append (cdr pln) (list (car pln)))))
  224.                         (setq bln (mapcar (function (lambda ( p1 c p2 ) (if (> perc 100.0) (- (abs (/ (sin (/ (setq a (* 2.0 (asin (/ (/ (distance p1 p2) 2.0) (cadr c))))) 4.0)) (cos (/ a 4.0))))) (abs (/ (sin (/ (setq a (* 2.0 (asin (/ (/ (distance p1 p2) 2.0) (cadr c))))) 4.0)) (cos (/ a 4.0))))))) pln crl (append (cdr pln) (list (car pln)))))
  225.                       )
  226.                     )
  227.                     (prompt "\nPercent : ") (princ (rtos perc 2 20))
  228.                     (updatelw lwx pln bln)
  229.                   )
  230.                 )
  231.               )
  232.             )
  233.           )
  234.           (progn
  235.             (setq dd
  236.               (cond
  237.                 ( (initget 6) )
  238.                 ( (setq dd (getdist "\nPick or specify delta step distance <1.0> : ")) )
  239.                 ( t 1.0 )
  240.               )
  241.             )
  242.             (setq loop 1 ll 0.0 k 0)
  243.             (prompt (strcat "\n" msg "\n"))
  244.             (prompt "\nDistribution of delta distances : ") (princ k)
  245.             (prompt "\nDelta step distance : ") (princ (rtos dd 2 20)) (prompt "\rTotal delta distances applied : ") (princ (rtos (* dd k) 2 20))
  246.             (while (/= (car (setq g (grread))) 3)
  247.               (if (and (= (car g) 2) (< 48 (cadr g) 58))
  248.                 (progn
  249.                   (setq loop (- (cadr g) 48))
  250.                   (prompt "\nSpeed : ") (princ loop)
  251.                 )
  252.                 (progn
  253.                   (prompt (strcat "\n" msg))
  254.                   (repeat loop
  255.                     (cond
  256.                       ( (equal g (list 2 60))
  257.                         (setq ll (- ll (* loop dd)) k (- k loop))
  258.                       )
  259.                       ( (equal g (list 2 62))
  260.                         (setq ll (+ ll (* loop dd)) k (+ k loop))
  261.                       )
  262.                     )
  263.                     (setq pln (mapcar (function (lambda ( p ) (mapcar (function +) cen (mapcar (function (lambda ( vc ) (* vc (+ (distance (list 0.0 0.0 0.0) (mapcar (function -) p cen)) ll)))) (unit (mapcar (function -) p cen)))))) pl))
  264.                     (if (= k 0)
  265.                       (setq bln nil)
  266.                       (progn
  267.                         (setq crl (mapcar (function (lambda ( p1 p2 p3 ) (LM:3pcircle p1 p2 p3))) pln mpl (append (cdr pln) (list (car pln)))))
  268.                         (setq bln (mapcar (function (lambda ( p1 c p2 ) (if (> perc 100.0) (- (abs (/ (sin (/ (setq a (* 2.0 (asin (/ (/ (distance p1 p2) 2.0) (cadr c))))) 4.0)) (cos (/ a 4.0))))) (abs (/ (sin (/ (setq a (* 2.0 (asin (/ (/ (distance p1 p2) 2.0) (cadr c))))) 4.0)) (cos (/ a 4.0))))))) pln crl (append (cdr pln) (list (car pln)))))
  269.                       )
  270.                     )
  271.                     (prompt "\nDistribution of delta distances : ") (princ k)
  272.                     (prompt "\nDelta step distance : ") (princ (rtos dd 2 20)) (prompt "\rTotal delta distances applied : ") (princ (rtos (* dd k) 2 20))
  273.                     (updatelw lwx pln bln)
  274.                   )
  275.                 )
  276.               )
  277.             )
  278.           )
  279.         )
  280.       )
  281.     )
  282.     (prompt "\nMissed or wrong entity picked (not CLOSED POLYGONAL LWPOLYLINE on unlocked layer)...")
  283.   )
  284.   (princ)
  285. )
  286.  

Something's not doing well and I am tired now...
Please, help us if you are available...

M.R.

[EDIT : Code fixed and updated...]
« Last Edit: May 30, 2022, 02:51:08 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3297
  • Marko Ribar, architect
Re: Very late tonight - can someone check the code - routine...
« Reply #1 on: May 30, 2022, 01:26:00 AM »
Sorry for the delay, I was tired yesterday...
Code fixed now - updated first post...

HTH. M.R.
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

d2010

  • Bull Frog
  • Posts: 326
Re: Very late tonight - can someone check the code - routine...
« Reply #2 on: May 30, 2022, 12:21:36 PM »
Please,You upload  a sample Before.dwg and After.dwg
Please you make a tiny Demo, how to use?
 :straight: