Jump to content

Hello everyone! Please take a look at this.


Recommended Posts

Posted (edited)

Could you please take a look and explain why this Lisp program is producing this result? 27807.35m²

Please help me adjust the result. 27807.35m²

I know nothing about Lisp.

thank you .

 

(defun rh:dxf (code lst) (cdr (assoc code lst)))

(defun c:aa ( / cmde ent e_typ e_lst area vtx x_lst y_lst z_lst x_pt y_pt z_pt c_lst v_lst ss sum)
  (cond
    ( (/= 0 (getvar 'cmdecho))
      (setq cmde (getvar 'cmdecho))
      (setvar 'cmdecho 0)
    )
  )
  (while
    (setq ss (ssget "_+.:E:S"
      '((0 . "POLYLINE,LWPOLYLINE")
        (-4 . "<OR")
        (70 . 1) (70 . 3) (70 . 5)
        (-4 . "OR>")
      )
    ))
    (setq ent (ssname ss 0)
          e_typ (rh:dxf 0 (setq e_lst (entget ent)))
          area (getpropertyvalue ent "area")
          v_lst nil
    )
    (cond
      ( (= e_typ "POLYLINE")
        (setq ent (entnext ent)
              vtx (rh:dxf 10 (entget ent))
        )
        (if (< (length vtx) 3) (setq vtx (reverse (cons 0.0 (reverse vtx)))))
        (while (/= "SEQEND" (cdr (assoc 0 (entget ent))))
          (setq v_lst (cons vtx v_lst)
                ent (entnext ent)
                vtx (rh:dxf 10 (entget ent))
          )
          (if (< (length vtx) 3) (setq vtx (reverse (cons 0.0 (reverse vtx)))))
        )
        (setq x_pt (/ (apply '+ (mapcar '(lambda (x) (car x)) v_lst)) (length v_lst))
              y_pt (/ (apply '+ (mapcar '(lambda (x) (cadr x)) v_lst)) (length v_lst))
        )
        (if (= (setq sum (apply '+ (mapcar '(lambda (x) (caddr x)) v_lst))) 0.0)
          (setq z_pt 0.0)
          (setq z_pt (/ sum (length v_lst)))
        )
      )
      ( (= e_typ "LWPOLYLINE")
        (setq z_pt (rh:dxf 38 e_lst))
        (foreach pr e_lst
          (if (= (car pr) 10) (setq v_lst (cons (cdr pr) v_lst)))
        )
        (setq x_pt (/ (apply '+ (mapcar '(lambda (x) (car x)) v_lst)) (length v_lst))
              y_pt (/ (apply '+ (mapcar '(lambda (x) (cadr x)) v_lst)) (length v_lst))
        )
      )
    )
    (setq c_lst (list x_pt y_pt z_pt))
    (entmakex
      (list
        (cons 0 "MTEXT")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbMText")
        (cons 10  c_lst)
        (cons 40 (getvar 'textsize))
        (cons 71 5)
        (cons 72 5)
        (cons 1 (strcat (rtos (/ area 1000000.0) 2 2) "m²"))
; (cons 1 (rtos (/ area 1000000.0) 2 3)) ; If you don't need the suffix "m²"
      )
    )
  )
  (if cmde (setvar 'cmdecho cmde))
)

 

Edited by SLW210
Added Code Tags!!
Posted

Please use Code Tags for your code in the future. (press the <> in the editor toolbar)

Posted

try  this      (cons 1 (strcat (rtos (/ area 1000000.0) 2 2) "m\U+00B2"))

  • Like 1
Posted
2 hours ago, sd2006 said:

thank you @yangguoshe but error 

error: no function definition: RH:DXF

help me.

You must've copied the changes into your code incorrectly. "RH: DXF" is already defined in your original code.

(defun rh:dxf (code lst) (cdr (assoc code lst)))

 

Attached is your original code with @mhupp's change:

(defun rh:dxf (code lst) (cdr (assoc code lst)))

(defun c:aa ( / cmde ent e_typ e_lst area vtx x_lst y_lst z_lst x_pt y_pt z_pt c_lst v_lst ss sum)
  (cond
    ( (/= 0 (getvar 'cmdecho))
      (setq cmde (getvar 'cmdecho))
      (setvar 'cmdecho 0)
    )
  )
  (while
    (setq ss (ssget "_+.:E:S"
      '((0 . "POLYLINE,LWPOLYLINE")
        (-4 . "<OR")
        (70 . 1) (70 . 3) (70 . 5)
        (-4 . "OR>")
      )
    ))
    (setq ent (ssname ss 0)
          e_typ (rh:dxf 0 (setq e_lst (entget ent)))
          area (getpropertyvalue ent "area")
          v_lst nil
    )
    (cond
      ( (= e_typ "POLYLINE")
        (setq ent (entnext ent)
              vtx (rh:dxf 10 (entget ent))
        )
        (if (< (length vtx) 3) (setq vtx (reverse (cons 0.0 (reverse vtx)))))
        (while (/= "SEQEND" (cdr (assoc 0 (entget ent))))
          (setq v_lst (cons vtx v_lst)
                ent (entnext ent)
                vtx (rh:dxf 10 (entget ent))
          )
          (if (< (length vtx) 3) (setq vtx (reverse (cons 0.0 (reverse vtx)))))
        )
        (setq x_pt (/ (apply '+ (mapcar '(lambda (x) (car x)) v_lst)) (length v_lst))
              y_pt (/ (apply '+ (mapcar '(lambda (x) (cadr x)) v_lst)) (length v_lst))
        )
        (if (= (setq sum (apply '+ (mapcar '(lambda (x) (caddr x)) v_lst))) 0.0)
          (setq z_pt 0.0)
          (setq z_pt (/ sum (length v_lst)))
        )
      )
      ( (= e_typ "LWPOLYLINE")
        (setq z_pt (rh:dxf 38 e_lst))
        (foreach pr e_lst
          (if (= (car pr) 10) (setq v_lst (cons (cdr pr) v_lst)))
        )
        (setq x_pt (/ (apply '+ (mapcar '(lambda (x) (car x)) v_lst)) (length v_lst))
              y_pt (/ (apply '+ (mapcar '(lambda (x) (cadr x)) v_lst)) (length v_lst))
        )
      )
    )
    (setq c_lst (list x_pt y_pt z_pt))
    (entmakex
      (list
        (cons 0 "MTEXT")
        (cons 100 "AcDbEntity")
        (cons 100 "AcDbMText")
        (cons 10  c_lst)
        (cons 40 (getvar 'textsize))
        (cons 71 5)
        (cons 72 5)
        (cons 1 (strcat (rtos (/ area 1000000.0) 2 2) "m" (chr 0178)))
        ; (cons 1 (strcat (rtos (/ area 1000000.0) 2 2) "m²"))
        ; (cons 1 (rtos (/ area 1000000.0) 2 3)) ; If you don't need the suffix "m²"
      )
    )
  )
  (if cmde (setvar 'cmdecho cmde))
)

 

  • Thanks 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...