Author Topic: question about region offset  (Read 3573 times)

0 Members and 1 Guest are viewing this topic.

Tsec2nd

  • Mosquito
  • Posts: 9
question about region offset
« on: June 11, 2018, 06:55:51 AM »
I am not sure I can express the questin clearly because of my poor english. So please see the attached file ,maybe you can understand what I mean.

I need you help to offset diffrent regions.The out loops offset towards outside,the innerloop offset towards inside and the regions which only have one loop offset towards inside.

It would be grateful for any idea.

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #1 on: June 11, 2018, 07:40:12 AM »
It is easier to do it manually... Do you want to offset every exploded region and therefore created polylines by the same amount of offset distance inside/outside? One more thing, why do you need this if I may ask? It looks to me like masochistic task for programming and resulting effect is minor unless something more concrete is an issue...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

Tsec2nd

  • Mosquito
  • Posts: 9
Re: question about region offset
« Reply #2 on: June 11, 2018, 08:25:05 AM »
Yes,I want offset every exploded region by the same distance in diffrent direction(outside or inside). It is used
under specified conditions.

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #3 on: June 11, 2018, 02:54:18 PM »
OK... Here you are, but next time you are on your own...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:complexregoff ( / *adoc* reg minbb maxbb d el 3dsl regl )
  2.  
  3.  
  4.   (if (= 8 (logand 8 (getvar 'undoctl)))
  5.     (vla-endundomark *adoc*)
  6.   )
  7.   (vla-startundomark *adoc*)
  8.   (while
  9.     (or
  10.       (not (setq reg (car (entsel "\nPick complex region to do alternative offset inside - smaller areas..."))))
  11.       (if reg
  12.         (or
  13.           (/= (cdr (assoc 0 (entget reg))) "REGION")
  14.           (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 (entget reg))))))))
  15.         )
  16.       )
  17.     )
  18.     (prompt "\nMissed or picked wrong entity type, or picked region entity on locked layer...")
  19.   )
  20.   (vla-getboundingbox (vlax-ename->vla-object reg) 'minbb 'maxbb)
  21.   (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  22.   (if (not (and (equal (caddr minbb) 0.0 1e-6) (equal (caddr maxbb) 0.0 1e-6)))
  23.     (progn
  24.       (prompt "\nPicked region entity don't lie in WCS. Place reference region entity in WCS plane and restart routine next time...")
  25.       (exit)
  26.     )
  27.   )
  28.   (initget 7)
  29.   (setq d (getdist "\nPick or specify offset distance : "))
  30.   (if (/= (getvar 'worlducs) 1)
  31.     (progn
  32.       (prompt "\nSet UCS to WCS and restart routine next time...")
  33.       (exit)
  34.     )
  35.     (vl-cmdf "_.UCS" "_M" "_non" (list 0.0 0.0 d))
  36.   )
  37.   (setq el (entlast))
  38.   (vl-cmdf "_.EXTRUDE" reg "" (* d 3.0))
  39.   (while (< 0 (getvar 'cmdactive))
  40.     (vl-cmdf "")
  41.   )
  42.   (while (setq el (entnext el))
  43.     (setq 3dsl (cons el 3dsl))
  44.   )
  45.   (foreach 3ds 3dsl
  46.     (vl-cmdf "_.SOLIDEDIT" "_B" "_S" 3ds "" d)
  47.     (while (< 0 (getvar 'cmdactive))
  48.       (vl-cmdf "")
  49.     )
  50.     (setq el (entlast))
  51.     (vl-cmdf "_.EXPLODE" 3ds)
  52.     (while (< 0 (getvar 'cmdactive))
  53.       (vl-cmdf "")
  54.     )
  55.     (while (setq el (entnext el))
  56.       (setq regl (cons el regl))
  57.     )
  58.     (foreach r regl
  59.       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list (vlax-ename->vla-object r)))))
  60.         (vla-move (vlax-ename->vla-object r) (vlax-3d-point (list 0.0 0.0 d)) (vlax-3d-point '(0.0 0.0 0.0)))
  61.         (entdel r)
  62.       )
  63.     )
  64.     (setq regl nil)
  65.   )
  66.   (vl-cmdf "_.UCS" "_P")
  67.   (vla-endundomark *adoc*)
  68.   (princ)
  69. )
  70.  

Regards, M.R.
« Last Edit: June 18, 2018, 07:06:47 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #4 on: June 11, 2018, 05:08:36 PM »
You haven't asked for it, but if you need opposite offsets it is slightly different... Plus you must have A2012+ (CONVTOSURFACE command and THICKEN command)...

Code - Auto/Visual Lisp: [Select]
  1. (defun c:complexregoff ( / *adoc* reg minbb maxbb d el 3ds 3dsl regl )
  2.  
  3.  
  4.   (if (= 8 (logand 8 (getvar 'undoctl)))
  5.     (vla-endundomark *adoc*)
  6.   )
  7.   (vla-startundomark *adoc*)
  8.   (while
  9.     (or
  10.       (not (setq reg (car (entsel "\nPick complex region to do alternative offset outside - bigger areas..."))))
  11.       (if reg
  12.         (or
  13.           (/= (cdr (assoc 0 (entget reg))) "REGION")
  14.           (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 (entget reg))))))))
  15.         )
  16.       )
  17.     )
  18.     (prompt "\nMissed or picked wrong entity type, or picked region entity on locked layer...")
  19.   )
  20.   (vla-getboundingbox (vlax-ename->vla-object reg) 'minbb 'maxbb)
  21.   (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  22.   (if (not (and (equal (caddr minbb) 0.0 1e-6) (equal (caddr maxbb) 0.0 1e-6)))
  23.     (progn
  24.       (prompt "\nPicked region entity don't lie in WCS. Place reference region entity in WCS plane and restart routine next time...")
  25.       (exit)
  26.     )
  27.   )
  28.   (initget 7)
  29.   (setq d (getdist "\nPick or specify offset distance : "))
  30.   (if (/= (getvar 'worlducs) 1)
  31.     (progn
  32.       (prompt "\nSet UCS to WCS and restart routine next time...")
  33.       (exit)
  34.     )
  35.     (vl-cmdf "_.UCS" "_M" "_non" (list 0.0 0.0 (- d)))
  36.   )
  37.   (setq el (entlast))
  38.   (vl-cmdf "_.EXTRUDE" reg "" (* d 3.0))
  39.   (while (< 0 (getvar 'cmdactive))
  40.     (vl-cmdf "")
  41.   )
  42.   (while (setq el (entnext el))
  43.     (setq 3dsl (cons el 3dsl))
  44.   )
  45.   (foreach 3ds 3dsl
  46.     (vl-cmdf "_.CONVTOSURFACE" 3ds "")
  47.     (vl-cmdf "_.THICKEN" (entlast) "" d)
  48.     (while (< 0 (getvar 'cmdactive))
  49.       (vl-cmdf "")
  50.     )
  51.     (setq 3ds (entlast) el 3ds)
  52.     (vl-cmdf "_.EXPLODE" 3ds)
  53.     (while (< 0 (getvar 'cmdactive))
  54.       (vl-cmdf "")
  55.     )
  56.     (while (setq el (entnext el))
  57.       (setq regl (cons el regl))
  58.     )
  59.     (foreach r regl
  60.       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list (vlax-ename->vla-object r)))))
  61.         (vla-move (vlax-ename->vla-object r) (vlax-3d-point '(0.0 0.0 0.0)) (vlax-3d-point (list 0.0 0.0 d)))
  62.         (entdel r)
  63.       )
  64.     )
  65.     (setq regl nil)
  66.   )
  67.   (vl-cmdf "_.UCS" "_P")
  68.   (vla-endundomark *adoc*)
  69.   (princ)
  70. )
  71.  

Regards, M.R.
« Last Edit: June 18, 2018, 07:07:13 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

Tsec2nd

  • Mosquito
  • Posts: 9
Re: question about region offset
« Reply #5 on: June 11, 2018, 10:07:42 PM »
Dear Sir, Thank you for your warmhearted help.I'll take some time to digest it because I am not familiar with 3D commands.Thanks again!

Taner

 

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #6 on: June 13, 2018, 12:09:33 PM »
I've hasetated to post 2 more offseting codes because of the issue I described here :
http://www.theswamp.org/index.php?topic=54245.msg588507#msg588507

But as I figured where the problem was, I am glad that now I can post (vla-offset) versions... So 2 more caases are solved : offseting complex region inside - all offsets are one way (not alternative like it was requested and solved by using 3D operations); and offseting complex region outside - also one way...

Note that those 2 codes are exactly the same, only difference is sign : (if (> ar arp) ... ) for inside and (if (< ar arp) ... ) for outside...

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

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #7 on: June 13, 2018, 12:10:30 PM »
Code - Auto/Visual Lisp: [Select]
  1. (defun c:complexregoff ( / unique car-sort chiv *adoc* reg minbb maxbb d el 3dsl regl nregl ss pll plll npll big p pl ar arp catch )
  2.  
  3.  
  4.   (defun unique ( l )
  5.     (if l
  6.       (cons (car l)
  7.         (unique (vl-remove (car l) l))
  8.       )
  9.     )
  10.   )
  11.  
  12.   (defun car-sort ( l f / removenth r k )
  13.  
  14.     (defun removenth ( l n / k )
  15.       (setq k -1)
  16.       (vl-remove-if '(lambda ( x ) (= (setq k (1+ k)) n)) l)
  17.     )
  18.  
  19.     (setq k -1)
  20.     (vl-some '(lambda ( a ) (setq k (1+ k)) (if (vl-every '(lambda ( x ) (apply f (list a x))) (removenth l k)) (setq r a))) l)
  21.     r
  22.   )
  23.  
  24.   (defun chiv ( e p / ed edd eddd eddd1 eddd2 eddd3 newed m n i ) ; args e - ename of lwpolyline, p - new initial vertex point in WCS
  25.  
  26.     (vl-load-com)
  27.  
  28.     (setq ed (entget e))
  29.     (setq edd nil)
  30.     (foreach ec ed
  31.       (if (not
  32.             (or (eq (car ec) 10) (eq (car ec) 40) (eq (car ec) 41) (eq (car ec) 42) (eq (car ec) 91) (eq (car ec) 210))
  33.           )
  34.           (setq edd (cons ec edd))
  35.       )
  36.     )
  37.     (setq edd (reverse edd))
  38.     (setq eddd nil)
  39.     (setq eddd1 nil)
  40.     (setq eddd2 nil)
  41.     (setq eddd (member (assoc 10 ed) ed))
  42.     ;;;(setq p (getpoint "\nPick vertex you want to become initial"))
  43.     (if (assoc 91 ed) (setq n (* m 5)) (setq n (* m 4)))
  44.     (setq i 0)
  45.     (foreach ec eddd
  46.       (progn
  47.         (setq i (+ i 1))
  48.         (if (<= i n)
  49.           (setq eddd1 (cons ec eddd1))
  50.         )
  51.         (if (> i n)
  52.           (setq eddd2 (cons ec eddd2))
  53.         )
  54.       )
  55.     )
  56.     (setq eddd1 (reverse eddd1))
  57.     (setq eddd3 (list (assoc 210 eddd2)))
  58.     (setq eddd2 (cdr eddd2))
  59.     (setq eddd2 (reverse eddd2))
  60.     (setq newed (append edd eddd2 eddd1 eddd3))
  61.     (entmod newed)
  62.     (entupd e)
  63.   )
  64.  
  65.   (if (= 8 (logand 8 (getvar 'undoctl)))
  66.     (vla-endundomark *adoc*)
  67.   )
  68.   (vla-startundomark *adoc*)
  69.   (while
  70.     (or
  71.       (not (setq reg (car (entsel "\nPick complex region to do one-way offset inside..."))))
  72.       (if reg
  73.         (or
  74.           (/= (cdr (assoc 0 (entget reg))) "REGION")
  75.           (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 (entget reg))))))))
  76.         )
  77.       )
  78.     )
  79.     (prompt "\nMissed or picked wrong entity type, or picked region entity on locked layer...")
  80.   )
  81.   (vla-getboundingbox (vlax-ename->vla-object reg) 'minbb 'maxbb)
  82.   (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  83.   (if (not (and (equal (caddr minbb) 0.0 1e-6) (equal (caddr maxbb) 0.0 1e-6)))
  84.     (progn
  85.       (prompt "\nPicked region entity don't lie in WCS. Place reference region entity in WCS plane and restart routine next time...")
  86.       (exit)
  87.     )
  88.   )
  89.   (initget 7)
  90.   (setq d (getdist "\nPick or specify offset distance : "))
  91.   (if (/= (getvar 'worlducs) 1)
  92.     (progn
  93.       (prompt "\nSet UCS to WCS and restart routine next time...")
  94.       (exit)
  95.     )
  96.   )
  97.   (setq el (entlast))
  98.   (vl-cmdf "_.EXTRUDE" reg "" (* d 3.0))
  99.   (while (< 0 (getvar 'cmdactive))
  100.     (vl-cmdf "")
  101.   )
  102.   (while (setq el (entnext el))
  103.     (setq 3dsl (cons el 3dsl))
  104.   )
  105.   (foreach 3ds 3dsl
  106.     (setq el (entlast))
  107.     (vl-cmdf "_.EXPLODE" 3ds)
  108.     (while (< 0 (getvar 'cmdactive))
  109.       (vl-cmdf "")
  110.     )
  111.     (while (setq el (entnext el))
  112.       (setq regl (cons el regl))
  113.     )
  114.     (foreach r regl
  115.       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list (vlax-ename->vla-object r)))))
  116.         (setq nregl (cons r nregl))
  117.         (entdel r)
  118.       )
  119.     )
  120.     (foreach r nregl
  121.       (setq el (entlast))
  122.       (vl-cmdf "_.EXPLODE" r)
  123.       (while (< 0 (getvar 'cmdactive))
  124.         (vl-cmdf "")
  125.       )
  126.       (setq ss (ssadd))
  127.       (while (setq el (entnext el))
  128.         (ssadd el ss)
  129.       )
  130.       (setq pl (mapcar '(lambda ( x ) (vlax-curve-getstartpoint x)) (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
  131.       (initcommandversion)
  132.       (vl-cmdf "_.JOIN" ss)
  133.       (while (< 0 (getvar 'cmdactive))
  134.         (vl-cmdf "")
  135.       )
  136.       (foreach p pl
  137.         (setq pll (cons (car (nentselp p)) pll))
  138.       )
  139.       (setq plll (unique pll))
  140.       (setq pll nil)
  141.       (foreach pl plll
  142.         (vl-cmdf "_.REGION" pl)
  143.         (while (< 0 (getvar 'cmdactive))
  144.           (vl-cmdf "")
  145.         )
  146.         (setq ar (vla-get-area (vlax-ename->vla-object (entlast))))
  147.         (vl-cmdf "_.UNDO" "1")
  148.         (setq pll (cons (list ar pl) pll))
  149.       )
  150.       (setq pll (vl-sort pll '(lambda ( a b ) (> (car a) (car b)))))
  151.       (setq pll (mapcar 'cadr pll))
  152.       (foreach pl pll
  153.         (setq el (entlast))
  154.         (if (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  155.           (progn
  156.             (vla-getboundingbox (vlax-ename->vla-object pl) 'minbb 'maxbb)
  157.             (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  158.             (setq plll (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget pl)))) pl 0)) (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget pl)))))
  159.             (chiv pl (car-sort plll '(lambda ( a b ) (<= (distance minbb a) (distance minbb b)))))
  160.             (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) 0.001)))
  161.           )
  162.           (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) 0.001)))
  163.         )
  164.         (if (not (vl-catch-all-error-p catch))
  165.           (progn
  166.             (setq ss (ssadd))
  167.             (while (setq el (entnext el))
  168.               (ssadd el ss)
  169.             )
  170.           )
  171.         )
  172.         (setq p (vlax-curve-getstartpoint (ssname ss 0)))
  173.         (initcommandversion)
  174.         (vl-cmdf "_.JOIN" ss)
  175.         (while (< 0 (getvar 'cmdactive))
  176.           (vl-cmdf "")
  177.         )
  178.         (vl-cmdf "_.REGION" (car (nentselp p)))
  179.         (while (< 0 (getvar 'cmdactive))
  180.           (vl-cmdf "")
  181.         )
  182.         (setq ar (vla-get-area (vlax-ename->vla-object (entlast))))
  183.         (vl-cmdf "_.UNDO" "1")
  184.         (vl-cmdf "_.REGION" pl)
  185.         (while (< 0 (getvar 'cmdactive))
  186.           (vl-cmdf "")
  187.         )
  188.         (setq arp (vla-get-area (vlax-ename->vla-object (entlast))))
  189.         (vl-cmdf "_.UNDO" "1")
  190.         (if (> ar arp)
  191.           (progn
  192.             (entdel (car (nentselp p)))
  193.             (setq el (entlast))
  194.             (if (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  195.               (progn
  196.                 (vla-getboundingbox (vlax-ename->vla-object pl) 'minbb 'maxbb)
  197.                 (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  198.                 (setq plll (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget pl)))) pl 0)) (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget pl)))))
  199.                 (chiv pl (car-sort plll '(lambda ( a b ) (<= (distance minbb a) (distance minbb b)))))
  200.                 (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) (- d))))
  201.               )
  202.               (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) (- d))))
  203.             )
  204.             (if (not (vl-catch-all-error-p catch))
  205.               (progn
  206.                 (setq ss (ssadd))
  207.                 (while (setq el (entnext el))
  208.                   (ssadd el ss)
  209.                 )
  210.               )
  211.             )
  212.             (setq p (vlax-curve-getstartpoint (ssname ss 0)))
  213.             (initcommandversion)
  214.             (vl-cmdf "_.JOIN" ss)
  215.             (while (< 0 (getvar 'cmdactive))
  216.               (vl-cmdf "")
  217.             )
  218.           )
  219.           (progn
  220.             (entdel (car (nentselp p)))
  221.             (setq el (entlast))
  222.             (if (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  223.               (progn
  224.                 (vla-getboundingbox (vlax-ename->vla-object pl) 'minbb 'maxbb)
  225.                 (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  226.                 (setq plll (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget pl)))) pl 0)) (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget pl)))))
  227.                 (chiv pl (car-sort plll '(lambda ( a b ) (<= (distance minbb a) (distance minbb b)))))
  228.                 (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) d)))
  229.               )
  230.               (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) d)))
  231.             )
  232.             (if (not (vl-catch-all-error-p catch))
  233.               (progn
  234.                 (setq ss (ssadd))
  235.                 (while (setq el (entnext el))
  236.                   (ssadd el ss)
  237.                 )
  238.               )
  239.             )
  240.             (setq p (vlax-curve-getstartpoint (ssname ss 0)))
  241.             (initcommandversion)
  242.             (vl-cmdf "_.JOIN" ss)
  243.             (while (< 0 (getvar 'cmdactive))
  244.               (vl-cmdf "")
  245.             )
  246.           )
  247.         )
  248.         (setq npll (cons (car (nentselp p)) npll))
  249.       )
  250.       (setq npll (reverse npll))
  251.       (vl-cmdf "_.REGION" (car npll))
  252.       (while (< 0 (getvar 'cmdactive))
  253.         (vl-cmdf "")
  254.       )
  255.       (setq big (entlast))
  256.       (foreach pl (cdr npll)
  257.         (vl-cmdf "_.REGION" pl)
  258.         (while (< 0 (getvar 'cmdactive))
  259.           (vl-cmdf "")
  260.         )
  261.         (vla-boolean (vlax-ename->vla-object big) acsubtraction (vlax-ename->vla-object (entlast)))
  262.       )
  263.       (foreach pl pll
  264.         (entdel pl)
  265.       )
  266.       (setq pll nil npll nil)
  267.     )
  268.     (setq regl nil nregl nil)
  269.   )
  270.   (vla-endundomark *adoc*)
  271.   (princ)
  272. )
  273.  
« Last Edit: June 18, 2018, 07:12:02 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #8 on: June 13, 2018, 12:11:10 PM »
Code - Auto/Visual Lisp: [Select]
  1. (defun c:complexregoff ( / unique car-sort chiv *adoc* reg minbb maxbb d el 3dsl regl nregl ss pll plll npll big p pl ar arp catch )
  2.  
  3.  
  4.   (defun unique ( l )
  5.     (if l
  6.       (cons (car l)
  7.         (unique (vl-remove (car l) l))
  8.       )
  9.     )
  10.   )
  11.  
  12.   (defun car-sort ( l f / removenth r k )
  13.  
  14.     (defun removenth ( l n / k )
  15.       (setq k -1)
  16.       (vl-remove-if '(lambda ( x ) (= (setq k (1+ k)) n)) l)
  17.     )
  18.  
  19.     (setq k -1)
  20.     (vl-some '(lambda ( a ) (setq k (1+ k)) (if (vl-every '(lambda ( x ) (apply f (list a x))) (removenth l k)) (setq r a))) l)
  21.     r
  22.   )
  23.  
  24.   (defun chiv ( e p / ed edd eddd eddd1 eddd2 eddd3 newed m n i ) ; args e - ename of lwpolyline, p - new initial vertex point in WCS
  25.  
  26.     (vl-load-com)
  27.  
  28.     (setq ed (entget e))
  29.     (setq edd nil)
  30.     (foreach ec ed
  31.       (if (not
  32.             (or (eq (car ec) 10) (eq (car ec) 40) (eq (car ec) 41) (eq (car ec) 42) (eq (car ec) 91) (eq (car ec) 210))
  33.           )
  34.           (setq edd (cons ec edd))
  35.       )
  36.     )
  37.     (setq edd (reverse edd))
  38.     (setq eddd nil)
  39.     (setq eddd1 nil)
  40.     (setq eddd2 nil)
  41.     (setq eddd (member (assoc 10 ed) ed))
  42.     ;;;(setq p (getpoint "\nPick vertex you want to become initial"))
  43.     (if (assoc 91 ed) (setq n (* m 5)) (setq n (* m 4)))
  44.     (setq i 0)
  45.     (foreach ec eddd
  46.       (progn
  47.         (setq i (+ i 1))
  48.         (if (<= i n)
  49.           (setq eddd1 (cons ec eddd1))
  50.         )
  51.         (if (> i n)
  52.           (setq eddd2 (cons ec eddd2))
  53.         )
  54.       )
  55.     )
  56.     (setq eddd1 (reverse eddd1))
  57.     (setq eddd3 (list (assoc 210 eddd2)))
  58.     (setq eddd2 (cdr eddd2))
  59.     (setq eddd2 (reverse eddd2))
  60.     (setq newed (append edd eddd2 eddd1 eddd3))
  61.     (entmod newed)
  62.     (entupd e)
  63.   )
  64.  
  65.   (if (= 8 (logand 8 (getvar 'undoctl)))
  66.     (vla-endundomark *adoc*)
  67.   )
  68.   (vla-startundomark *adoc*)
  69.   (while
  70.     (or
  71.       (not (setq reg (car (entsel "\nPick complex region to do one-way offset outside..."))))
  72.       (if reg
  73.         (or
  74.           (/= (cdr (assoc 0 (entget reg))) "REGION")
  75.           (= 4 (logand 4 (cdr (assoc 70 (tblsearch "LAYER" (cdr (assoc 8 (entget reg))))))))
  76.         )
  77.       )
  78.     )
  79.     (prompt "\nMissed or picked wrong entity type, or picked region entity on locked layer...")
  80.   )
  81.   (vla-getboundingbox (vlax-ename->vla-object reg) 'minbb 'maxbb)
  82.   (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  83.   (if (not (and (equal (caddr minbb) 0.0 1e-6) (equal (caddr maxbb) 0.0 1e-6)))
  84.     (progn
  85.       (prompt "\nPicked region entity don't lie in WCS. Place reference region entity in WCS plane and restart routine next time...")
  86.       (exit)
  87.     )
  88.   )
  89.   (initget 7)
  90.   (setq d (getdist "\nPick or specify offset distance : "))
  91.   (if (/= (getvar 'worlducs) 1)
  92.     (progn
  93.       (prompt "\nSet UCS to WCS and restart routine next time...")
  94.       (exit)
  95.     )
  96.   )
  97.   (setq el (entlast))
  98.   (vl-cmdf "_.EXTRUDE" reg "" (* d 3.0))
  99.   (while (< 0 (getvar 'cmdactive))
  100.     (vl-cmdf "")
  101.   )
  102.   (while (setq el (entnext el))
  103.     (setq 3dsl (cons el 3dsl))
  104.   )
  105.   (foreach 3ds 3dsl
  106.     (setq el (entlast))
  107.     (vl-cmdf "_.EXPLODE" 3ds)
  108.     (while (< 0 (getvar 'cmdactive))
  109.       (vl-cmdf "")
  110.     )
  111.     (while (setq el (entnext el))
  112.       (setq regl (cons el regl))
  113.     )
  114.     (foreach r regl
  115.       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list (vlax-ename->vla-object r)))))
  116.         (setq nregl (cons r nregl))
  117.         (entdel r)
  118.       )
  119.     )
  120.     (foreach r nregl
  121.       (setq el (entlast))
  122.       (vl-cmdf "_.EXPLODE" r)
  123.       (while (< 0 (getvar 'cmdactive))
  124.         (vl-cmdf "")
  125.       )
  126.       (setq ss (ssadd))
  127.       (while (setq el (entnext el))
  128.         (ssadd el ss)
  129.       )
  130.       (setq pl (mapcar '(lambda ( x ) (vlax-curve-getstartpoint x)) (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss)))))
  131.       (initcommandversion)
  132.       (vl-cmdf "_.JOIN" ss)
  133.       (while (< 0 (getvar 'cmdactive))
  134.         (vl-cmdf "")
  135.       )
  136.       (foreach p pl
  137.         (setq pll (cons (car (nentselp p)) pll))
  138.       )
  139.       (setq plll (unique pll))
  140.       (setq pll nil)
  141.       (foreach pl plll
  142.         (vl-cmdf "_.REGION" pl)
  143.         (while (< 0 (getvar 'cmdactive))
  144.           (vl-cmdf "")
  145.         )
  146.         (setq ar (vla-get-area (vlax-ename->vla-object (entlast))))
  147.         (vl-cmdf "_.UNDO" "1")
  148.         (setq pll (cons (list ar pl) pll))
  149.       )
  150.       (setq pll (vl-sort pll '(lambda ( a b ) (> (car a) (car b)))))
  151.       (setq pll (mapcar 'cadr pll))
  152.       (foreach pl pll
  153.         (setq el (entlast))
  154.         (if (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  155.           (progn
  156.             (vla-getboundingbox (vlax-ename->vla-object pl) 'minbb 'maxbb)
  157.             (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  158.             (setq plll (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget pl)))) pl 0)) (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget pl)))))
  159.             (chiv pl (car-sort plll '(lambda ( a b ) (<= (distance minbb a) (distance minbb b)))))
  160.             (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) 0.001)))
  161.           )
  162.           (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) 0.001)))
  163.         )
  164.         (if (not (vl-catch-all-error-p catch))
  165.           (progn
  166.             (setq ss (ssadd))
  167.             (while (setq el (entnext el))
  168.               (ssadd el ss)
  169.             )
  170.           )
  171.         )
  172.         (setq p (vlax-curve-getstartpoint (ssname ss 0)))
  173.         (initcommandversion)
  174.         (vl-cmdf "_.JOIN" ss)
  175.         (while (< 0 (getvar 'cmdactive))
  176.           (vl-cmdf "")
  177.         )
  178.         (vl-cmdf "_.REGION" (car (nentselp p)))
  179.         (while (< 0 (getvar 'cmdactive))
  180.           (vl-cmdf "")
  181.         )
  182.         (setq ar (vla-get-area (vlax-ename->vla-object (entlast))))
  183.         (vl-cmdf "_.UNDO" "1")
  184.         (vl-cmdf "_.REGION" pl)
  185.         (while (< 0 (getvar 'cmdactive))
  186.           (vl-cmdf "")
  187.         )
  188.         (setq arp (vla-get-area (vlax-ename->vla-object (entlast))))
  189.         (vl-cmdf "_.UNDO" "1")
  190.         (if (< ar arp)
  191.           (progn
  192.             (entdel (car (nentselp p)))
  193.             (setq el (entlast))
  194.             (if (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  195.               (progn
  196.                 (vla-getboundingbox (vlax-ename->vla-object pl) 'minbb 'maxbb)
  197.                 (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  198.                 (setq plll (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget pl)))) pl 0)) (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget pl)))))
  199.                 (chiv pl (car-sort plll '(lambda ( a b ) (<= (distance minbb a) (distance minbb b)))))
  200.                 (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) (- d))))
  201.               )
  202.               (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) (- d))))
  203.             )
  204.             (if (not (vl-catch-all-error-p catch))
  205.               (progn
  206.                 (setq ss (ssadd))
  207.                 (while (setq el (entnext el))
  208.                   (ssadd el ss)
  209.                 )
  210.               )
  211.             )
  212.             (setq p (vlax-curve-getstartpoint (ssname ss 0)))
  213.             (initcommandversion)
  214.             (vl-cmdf "_.JOIN" ss)
  215.             (while (< 0 (getvar 'cmdactive))
  216.               (vl-cmdf "")
  217.             )
  218.           )
  219.           (progn
  220.             (entdel (car (nentselp p)))
  221.             (setq el (entlast))
  222.             (if (= (cdr (assoc 0 (entget pl))) "LWPOLYLINE")
  223.               (progn
  224.                 (vla-getboundingbox (vlax-ename->vla-object pl) 'minbb 'maxbb)
  225.                 (mapcar 'set '(minbb maxbb) (mapcar 'safearray-value (list minbb maxbb)))
  226.                 (setq plll (mapcar '(lambda ( p ) (trans (list (car p) (cadr p) (cdr (assoc 38 (entget pl)))) pl 0)) (mapcar 'cdr (vl-remove-if '(lambda ( x ) (/= (car x) 10)) (entget pl)))))
  227.                 (chiv pl (car-sort plll '(lambda ( a b ) (<= (distance minbb a) (distance minbb b)))))
  228.                 (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) d)))
  229.               )
  230.               (setq catch (vl-catch-all-apply 'vla-offset (list (vlax-ename->vla-object pl) d)))
  231.             )
  232.             (if (not (vl-catch-all-error-p catch))
  233.               (progn
  234.                 (setq ss (ssadd))
  235.                 (while (setq el (entnext el))
  236.                   (ssadd el ss)
  237.                 )
  238.               )
  239.             )
  240.             (setq p (vlax-curve-getstartpoint (ssname ss 0)))
  241.             (initcommandversion)
  242.             (vl-cmdf "_.JOIN" ss)
  243.             (while (< 0 (getvar 'cmdactive))
  244.               (vl-cmdf "")
  245.             )
  246.           )
  247.         )
  248.         (setq npll (cons (car (nentselp p)) npll))
  249.       )
  250.       (setq npll (reverse npll))
  251.       (vl-cmdf "_.REGION" (car npll))
  252.       (while (< 0 (getvar 'cmdactive))
  253.         (vl-cmdf "")
  254.       )
  255.       (setq big (entlast))
  256.       (foreach pl (cdr npll)
  257.         (vl-cmdf "_.REGION" pl)
  258.         (while (< 0 (getvar 'cmdactive))
  259.           (vl-cmdf "")
  260.         )
  261.         (vla-boolean (vlax-ename->vla-object big) acsubtraction (vlax-ename->vla-object (entlast)))
  262.       )
  263.       (foreach pl pll
  264.         (entdel pl)
  265.       )
  266.       (setq pll nil npll nil)
  267.     )
  268.     (setq regl nil nregl nil)
  269.   )
  270.   (vla-endundomark *adoc*)
  271.   (princ)
  272. )
  273.  
« Last Edit: June 18, 2018, 07:12:22 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ScottMC

  • Newt
  • Posts: 191
Re: question about region offset
« Reply #9 on: June 17, 2018, 07:13:18 PM »
Q: My guess why this code won't work using my A2K is age, but in changing the "(vl-cmdf "_.JOIN" ss)" to pljoin was a not a solution and just doesnt even see the command.. Hopes are this works for the newer users as regions are useful! Makes me dig and learn.

ssdd

  • Newt
  • Posts: 35
Re: question about region offset
« Reply #10 on: June 17, 2018, 10:41:45 PM »
ribarm
 :smitten:

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: question about region offset
« Reply #11 on: June 18, 2018, 07:29:16 AM »
ribarm
 :smitten:

I've changed a little all 4 posted codes...
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

ahsattarian

  • Newt
  • Posts: 112
Re: question about region offset
« Reply #12 on: January 23, 2021, 12:46:35 AM »
This works better  :



Code - Auto/Visual Lisp: [Select]
  1. (defun c:a ()
  2.   (setq es (entsel "\n Select Region to Offset : "))
  3.   (setq or-var1 (getdist " Offset Distance : "))
  4.   (initget "In Out")
  5.   (setq or-var2 (getkword "\n Direction [ In / Out ] : "))
  6.   (setq s (car es))
  7.   (command "ucs" "object" (cadr es))
  8.   (setq di or-var1)
  9.   (cond ((= or-var2 "Out") (setq di (- di))))
  10.   (setq en (entget s))
  11.   (setq obj (vlax-ename->vla-object s))
  12.   (setq la (cdr (assoc 8 en)))
  13.   (cond ((= (logand 4 (cdr (assoc 70 (tblsearch "layer" la)))) 4) (command "layer" "unlock" la ""))) ;|  #lock  |;
  14.   (setvar "clayer" la)
  15.   (vl-cmdf "ucs" "m" "non" (list 0.0 0.0 di))
  16.   (setq s1 (entlast))
  17.   (vl-cmdf "extrude" s "" (* or-var1 3.0))
  18.   (while (< 0 (getvar 'cmdactive)) (vl-cmdf ""))
  19.   (setq 3dsl nil)
  20.   (while (setq s1 (entnext s1)) (setq 3dsl (cons s1 3dsl)))
  21.   (setq reg (ssadd))
  22.   (foreach 3ds 3dsl
  23.     (setq method1 1)
  24.     (cond
  25.       ((= method1 1) (vl-cmdf "solidedit" "b" "s" 3ds "" di))
  26.       ((= method1 2) (vl-cmdf "convtosurface" 3ds "" "thicken" "last" "" (- di)))
  27.     )
  28.     (while (< 0 (getvar 'cmdactive)) (vl-cmdf ""))
  29.     (setq s1 (entlast))
  30.     (cond
  31.       ((= method1 1) (vl-cmdf "explode" 3ds))
  32.       ((= method1 2) (vl-cmdf "explode" "last"))
  33.     )
  34.     (while (< 0 (getvar 'cmdactive)) (vl-cmdf ""))
  35.     (setq regl nil)
  36.     (while (setq s1 (entnext s1)) (setq regl (cons s1 regl)))
  37.     (foreach r regl
  38.       (setq obj1 (vlax-ename->vla-object r))
  39.       (if (not (vl-catch-all-error-p (vl-catch-all-apply 'vla-get-centroid (list obj1)))) ;|  #centroid  |;
  40.         (progn
  41.           (setq po1 (trans (list 0.0 0.0 di) 1 0))
  42.           (setq po2 (trans (list 0.0 0.0 0.0) 1 0))
  43.           (vla-move obj1 (vlax-3d-point po1) (vlax-3d-point po2))
  44.           (ssadd r reg)
  45.         )
  46.         (entdel r)
  47.       )
  48.     )
  49.   )
  50.   (cond ((> (sslength reg) 1) (command "union" reg "")))
  51.   (command "ucs" "world")
  52.   (princ)
  53. )




ScottMC

  • Newt
  • Posts: 191
Re: question about region offset
« Reply #13 on: January 23, 2021, 02:29:03 PM »
What is the simplest way to flip the region to get it toward the "Z+" direction. Would a "reverse" be able? Like this tool alot! and here's the var list:
   ( / en la obj s1 3ds r regl reg 3dsl es s di or-var1 po1 po2 or-var2 method1 )
« Last Edit: May 11, 2021, 04:33:56 PM by ScottMC »