Convert Lisp function to C#

Convert Lisp function to C#

alexisgacia
Advocate Advocate
545 Views
0 Replies
Message 1 of 1

Convert Lisp function to C#

alexisgacia
Advocate
Advocate

Hi Gentlemen,

 

Good day.

 

I am working in VBA tool and I'm trying to develop a tool in C# due to functionality. I am new to C# and no knowledge in Lisp. I'm trying to recreate the command CLP function in c# from the LISP code below. It was created by Marko Ribar. Is there any way to do this? Or is there a function already in C# for this?

 

The CLP command is to create an Arc from the reference of Circle,Line and Point.

 

To Convert to C#

 

 

  ;; CLP
  (defun CLP ( c r a b p / ab nab cn plixli ptsci pp1 pp2 lst )
    (setq ab (mapcar '- b a))
    (setq nab (nor+ ab))
    (setq cn (mapcar '+ c nab))
    (setq plixli (inters a b c cn nil))
    (setq ptsci (cixli c r c cn))
    (if (< (length lst) 4)
      (progn
        (setq pp1 (car (cixli (car (PPP (cadr ptsci) plixli p)) (cadr (PPP (cadr ptsci) plixli p)) p (car ptsci))))
        (setq pp2 (car (cixli (car (PPP (car ptsci) plixli p)) (cadr (PPP (car ptsci) plixli p)) p (cadr ptsci))))
        (setq lst (append lst (if (and pp1 (not (equal p pp1 1e-6))) (LPP a b p pp1)) (if (and pp2 (not (equal p pp2 1e-6))) (LPP a b p pp2))))
        (foreach x lst
          (if (and x (or (/= (length (cixli (car x) (cadr x) a b)) 1) (/= (length (ci1xci2 (car x) (cadr x) c r)) 1)))
            (setq lst (subst (list x t) x lst))
          )
        )
      )
    )
    (setq lst (vl-remove-if '(lambda ( x ) (eq (cadr x) T)) lst))
    (setq lst (unique lst))
    (if (< (length lst) 4)
      (progn
        (setq pp1 (cadr (cixli (car (PPP (cadr ptsci) plixli p)) (cadr (PPP (cadr ptsci) plixli p)) p (car ptsci))))
        (setq pp2 (car (cixli (car (PPP (car ptsci) plixli p)) (cadr (PPP (car ptsci) plixli p)) p (cadr ptsci))))
        (setq lst (append lst (if (and pp1 (not (equal p pp1 1e-6))) (LPP a b p pp1)) (if (and pp2 (not (equal p pp2 1e-6))) (LPP a b p pp2))))
        (foreach x lst
          (if (and x (or (/= (length (cixli (car x) (cadr x) a b)) 1) (/= (length (ci1xci2 (car x) (cadr x) c r)) 1)))
            (setq lst (subst (list x t) x lst))
          )
        )
      )
    )
    (setq lst (vl-remove-if '(lambda ( x ) (eq (cadr x) T)) lst))
    (setq lst (unique lst))
    (if (< (length lst) 4)
      (progn
        (setq pp1 (car (cixli (car (PPP (cadr ptsci) plixli p)) (cadr (PPP (cadr ptsci) plixli p)) p (car ptsci))))
        (setq pp2 (cadr (cixli (car (PPP (car ptsci) plixli p)) (cadr (PPP (car ptsci) plixli p)) p (cadr ptsci))))
        (setq lst (append lst (if (and pp1 (not (equal p pp1 1e-6))) (LPP a b p pp1)) (if (and pp2 (not (equal p pp2 1e-6))) (LPP a b p pp2))))
        (foreach x lst
          (if (and x (or (/= (length (cixli (car x) (cadr x) a b)) 1) (/= (length (ci1xci2 (car x) (cadr x) c r)) 1)))
            (setq lst (subst (list x t) x lst))
          )
        )
      )
    )
    (setq lst (vl-remove-if '(lambda ( x ) (eq (cadr x) T)) lst))
    (setq lst (unique lst))
    (if (< (length lst) 4)
      (progn
        (setq pp1 (cadr (cixli (car (PPP (cadr ptsci) plixli p)) (cadr (PPP (cadr ptsci) plixli p)) p (car ptsci))))
        (setq pp2 (cadr (cixli (car (PPP (car ptsci) plixli p)) (cadr (PPP (car ptsci) plixli p)) p (cadr ptsci))))
        (setq lst (append lst (if (and pp1 (not (equal p pp1 1e-6))) (LPP a b p pp1)) (if (and pp2 (not (equal p pp2 1e-6))) (LPP a b p pp2))))
        (foreach x lst
          (if (and x (or (/= (length (cixli (car x) (cadr x) a b)) 1) (/= (length (ci1xci2 (car x) (cadr x) c r)) 1)))
            (setq lst (subst (list x t) x lst))
          )
        )
      )
    )
    (setq lst (vl-remove-if '(lambda ( x ) (eq (cadr x) T)) lst))
    (unique lst)
  )



  (defun c:CLP ( / ssci1 ci1 ssli1 li1 c1 r1 a1 b1 p lst )
    (while (null ssci1)
      (prompt "\nPick circle...")
      (setq ssci1 (ssget "_+.:E:S" '((0 . "CIRCLE"))))
    )
    (setq ci1 (ssname ssci1 0))
    (setq c1 (trans (cdr (assoc 10 (entget ci1))) ci1 1))
    (setq c1 (list (car c1) (cadr c1) 0.0))
    (setq r1 (cdr (assoc 40 (entget ci1))))
    (while (or (null ssli1) (equal (ssname ssli1 0) (ssname ssci1 0)))
      (prompt "\nPick line...")
      (setq ssli1 (ssget "_+.:E:S" '((0 . "LINE"))))
    )
    (setq li1 (ssname ssli1 0))
    (setq a1 (trans (cdr (assoc 10 (entget li1))) 0 1))
    (setq a1 (list (car a1) (cadr a1) 0.0))
    (setq b1 (trans (cdr (assoc 11 (entget li1))) 0 1))
    (setq b1 (list (car b1) (cadr b1) 0.0))
    (initget 1)
    (setq p (getpoint "\nPick or specify point : "))
    (setq p (list (car p) (cadr p) 0.0))
    (setq lst (CLP c1 r1 a1 b1 p))
    (foreach ci lst
      (entmake (list (cons 0 "CIRCLE") (cons 10 (trans (car ci) 1 (trans '(0.0 0.0 1.0) 1 0 t))) (cons 40 (cadr ci)) (cons 62 3) (cons 210 (trans '(0.0 0.0 1.0) 1 0 t))))
    )
    (princ)
  )

 

 

 

Taken From this link : https://www.cadtutor.net/forum/files/file/29-apollonius-problem-solvedlsp/

 

 

Thank you in advance.

0 Likes
546 Views
0 Replies
Replies (0)