Author Topic: Problem in the while loop  (Read 1040 times)

0 Members and 1 Guest are viewing this topic.

Nima2018

  • Newt
  • Posts: 30
Problem in the while loop
« on: August 04, 2021, 08:34:00 AM »
Hi,
I want to put a few short inclined lines  on another line (pipeline) to show the position of the clamps that hold the pipes .
The start and end clamps are 6 inches from the two ends ,but the rest will be 60 feet apart  from each other and the distance between the last two clamps may be less than 60 feet.
For this purpose, I wrote the following code,but after executing the codes, the middle clamps are not drawn on the map ... Why?

This is the position of the clamps :

          1th                   2th                   3th                  4th               (n-1)th      nth
    ------/-----------------/-----------------/-----------------/-----------------/--------/------
     6"            60'                   60'                                                         <= 60'      6"


Code: [Select]
(defun c:FF1 (/     doc   mspace      p1    p2   dst ang   ang1
      ang2  int1  int2 pt1   pt2   lin1  lin2 dst2  dst3
      n     c   pt3 lin3
     )
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq mspace (vla-get-modelspace doc))
  (setq p1 (getpoint "Pick on first (1th) node : "))
  (setq p2 (getpoint "Pick on second (2th) node : "))
  (setq dst (distance p1 p2))
  (setq ang (angle p1 p2))
  (setq ang1 (+ ang 0.5235988))
  (setq ang2 (+ ang1 pi))
  (setq int1 (polar p1 ang 0.1524))
  (setq int2 (polar p1 ang (- dst 0.1524)))
  (setq Pt1 (polar int1 ang1 0.250))
  (setq Pt2 (polar int1 ang2 0.250))
  (setq lin1 (vla-AddLine
       mspace
       (vlax-3D-point (car pt1) (cadr pt1) (caddr pt1))
       (vlax-3D-point (car pt2) (cadr pt2) (caddr pt2))
     )
  )
  (vla-put-Color lin1 5)
  (setq lin2 (vla-copy lin1))
  (vla-move lin2
    (vlax-3D-point (car int1) (cadr int1) (caddr int1))
    (vlax-3D-point (car int2) (cadr int2) (caddr int2))
  )
  (princ)

  (setq dst2 (distance int1 int2))
  (setq n 0)
  (setq dst3 18.288)
 (while (> (- dst2 dst3) 18.288)
   (setq n (1+ n))
   (setq Pt3 (polar int1 ang (* dst3 n)))
   (setq lin3 (vla-copy lin1))
   (vla-move lin3
     (vlax-3D-point (car int1) (cadr int1) (caddr int1))
     (vlax-3D-point (car pt3) (cadr pt3) (caddr pt3))
   )

 )
)
« Last Edit: August 04, 2021, 08:46:05 AM by Nima2018 »

mhupp

  • Bull Frog
  • Posts: 250
Re: Problem in the while loop
« Reply #1 on: August 04, 2021, 09:44:32 AM »
This goes into an infinite loop because you never update dst2. The while will always be true if its longer then 66'

Code: [Select]
(defun c:FF1 (/ doc mspace p1 p2 dst ang ang1
                ang2 int1 int2 pt1 pt2 lin1 lin2 dst2 dst3
                n c pt3 lin3
             )
  (vl-load-com)
  (setq doc (vla-get-activedocument (vlax-get-acad-object)))
  (setq mspace (vla-get-modelspace doc))
  (setq p1 (getpoint "Pick on first (1th) node : "))
  (setq p2 (getpoint "Pick on second (2th) node : "))
  (setq dst (distance p1 p2))
  (setq ang (angle p1 p2))
  (setq ang1 (+ ang 0.5235988))
  (setq ang2 (+ ang1 pi))
  (setq int1 (polar p1 ang 0.1524))
  (setq int2 (polar p1 ang (- dst 0.1524)))
  (setq Pt1 (polar int1 ang1 0.250))
  (setq Pt2 (polar int1 ang2 0.250))
  (setq lin1 (vla-AddLine
               mspace
               (vlax-3D-point (car pt1) (cadr pt1) (caddr pt1)) ;why do this and not  (vlax-3D-point pt1)
               (vlax-3D-point (car pt2) (cadr pt2) (caddr pt2))
             )
  )
  (vla-put-Color lin1 5)
  (setq lin2 (vla-copy lin1))
  (vla-move lin2
            (vlax-3D-point (car int1) (cadr int1) (caddr int1))
            (vlax-3D-point (car int2) (cadr int2) (caddr int2))
  )
  (princ)

  (setq dst2 (+ (distance int1 int2) 18.288)) ;needed so end nth tick will be created
  (setq n 0)
  (setq dst3 18.288)
  (while (> (setq dst2 (- dst2 dst3)) 18.288) ;updates dst2 so loop will close
    (setq n (1+ n))
    (setq Pt3 (polar int1 ang (* dst3 n)))
    (setq lin3 (vla-copy lin1))
    (vla-move lin3
              (vlax-3D-point (car int1) (cadr int1) (caddr int1))
              (vlax-3D-point (car pt3) (cadr pt3) (caddr pt3))
    )

  )
)

Your spacing out left to right.
It would be better to go middle out so everything is evenly spaced.
« Last Edit: August 04, 2021, 09:57:46 AM by mhupp »

ribarm

  • Gator
  • Posts: 3265
  • Marko Ribar, architect
Re: Problem in the while loop
« Reply #2 on: August 04, 2021, 09:55:46 AM »
Untested...

Code: [Select]
(defun c:fff ( / l1 l2 l3 p1 p2 n k )
  (setq l1 (/ (* 6.0 2.54) 100.0))
  (setq l2 (/ (* 60.0 12 2.54) 100.0))
  (setq l3 0.25)
  (if
    (and
      (not (initget 1))
      (setq p1 (getpoint "\nPick or specify start point : "))
      (not (initget 1))
      (setq p2 (getpoint p1 "\nPick or specify end point : "))
    )
    (progn
      (entmake (list '(0 . "LINE") (cons 10 (polar p1 (- (angle p1 p2) (* 0.5 pi)) l3)) (cons 11 (polar p1 (+ (angle p1 p2) (* 0.5 pi)) l3)) '(62 . 5)))
      (if (> (distance p1 p2) l1)
        (progn
          (entmake (list '(0 . "LINE") (cons 10 (polar (polar p1 (angle p1 p2) l1) (- (angle p1 p2) (* 0.5 pi)) l3)) (cons 11 (polar (polar p1 (angle p1 p2) l1) (+ (angle p1 p2) (* 0.5 pi)) l3)) '(62 . 5)))
          (if (> (distance (polar p1 (angle p1 p2) l1) p2) l2)
            (progn
              (setq n (fix (/ (- (distance (polar p1 (angle p1 p2) l1) p2) l1) l2)))
              (setq k 0)
              (repeat n
                (entmake (list '(0 . "LINE") (cons 10 (polar (polar p1 (angle p1 p2) (+ l1 (* (setq k (1+ k)) l2))) (- (angle p1 p2) (* 0.5 pi)) l3)) (cons 11 (polar (polar p1 (angle p1 p2) (+ l1 (* k l2))) (+ (angle p1 p2) (* 0.5 pi)) l3)) '(62 . 5)))
              )
              (entmake (list '(0 . "LINE") (cons 10 (polar (polar p2 (angle p2 p1) l1) (- (angle p1 p2) (* 0.5 pi)) l3)) (cons 11 (polar (polar p2 (angle p2 p1) l1) (+ (angle p1 p2) (* 0.5 pi)) l3)) '(62 . 5)))
            )
            (if (> (distance (polar p1 (angle p1 p2) l1) p2) l1)
              (entmake (list '(0 . "LINE") (cons 10 (polar (polar p2 (angle p2 p1) l1) (- (angle p1 p2) (* 0.5 pi)) l3)) (cons 11 (polar (polar p2 (angle p2 p1) l1) (+ (angle p1 p2) (* 0.5 pi)) l3)) '(62 . 5)))
            )
          )
        )
      )
      (entmake (list '(0 . "LINE") (cons 10 (polar p2 (- (angle p1 p2) (* 0.5 pi)) l3)) (cons 11 (polar p2 (+ (angle p1 p2) (* 0.5 pi)) l3)) '(62 . 5)))
    )
  )
  (princ)
)

HTH.
« Last Edit: August 04, 2021, 10:19:57 AM by ribarm »
Marko Ribar, d.i.a. (graduated engineer of architecture)

:)

M.R. on Youtube

Nima2018

  • Newt
  • Posts: 30
Re: Problem in the while loop
« Reply #3 on: August 04, 2021, 10:37:21 AM »
Thank you very much dear ones
I learned a lot from you