Đến nội dung


Hình ảnh
- - - - -

[Đã xong] Lisp tính tổng chiều dài các đối tượng


  • Please log in to reply
5 replies to this topic

#1 Bommak

Bommak

    biết vẽ line

  • Members
  • PipPip
  • 25 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 16 May 2007 - 02:49 AM

Bác Hoành có thể giúp em cách tính tổng chiều dài của đối tượng Mline được không ạ. Em làm được với line, arc, circle, poly/lwpoly... nhưng với Mline thì em không làm được.
Em cảm ơn bác..
  • 0

#2 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 16 May 2007 - 08:59 AM

Bác Hoành có thể giúp em cách tính tổng chiều dài của đối tượng Mline được không ạ. Em làm được với line, arc, circle, poly/lwpoly... nhưng với Mline thì em không làm được.
Em cảm ơn bác..


Cách tính chiều dài của MLINE khá giống với LWPOLYLINE. Tuy nhiên ACAD cấu trúc dữ liệu hơi khác so với LWPOLYLINE một chút. Với LWPOLYLINE, tất cả các đỉnh đều có dạng (10 x y z), còn trong MLINE chỉ có đỉnh đầu tiên có dạng (10 x y z) còn các đỉnh sau đó đều có dạng (11 x y z). Sau đây là lệnh DAIMLINE để tính tổng chiều dài các MLINE được chọn:
(defun c:daimline ( / ss sdt tongdai index)
(defun daione (ent / pcu daiml p)
(defun adp (pt)
(cond ((= 10 (car pt))
(setq pcu (cdr pt)
daiml 0.0
)
)
((= 11 (car pt))
(setq
p (cdr pt)
daiml (+ daiml (distance p pcu))
pcu p
)
)
)
)
(setq tt (entget ent))
(foreach pt tt
(adp pt)
)
daiml
)
(setq ss (ssget '((0 . "MLINE")))
sdt (cond
(ss (sslength ss))
(t 0)
)
index 0
tongdai 0.0
)
(repeat sdt
(setq ent (ssname ss index)
index (1+ index)
tongdai (+ tongdai (daione ent))
)
)
(princ (strcat "\nTong chieu dai cac MLine tren la: "
(rtos tongdai 2 2)
)
)
(princ)
)

  • 0

#3 Bommak

Bommak

    biết vẽ line

  • Members
  • PipPip
  • 25 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 16 May 2007 - 04:42 PM

[quote name='Nguyen Hoanh' date='May 16 2007, 08:59 AM' post='2383']
Cách tính chiều dài của MLINE khá giống với LWPOLYLINE. Tuy nhiên ACAD c%2
  • 0

#4 Bommak

Bommak

    biết vẽ line

  • Members
  • PipPip
  • 25 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 16 May 2007 - 04:59 PM

Cách tính chiều dài của MLINE khá giống với LWPOLYLINE. Tuy nhiên ACAD cấu trúc dữ liệu hơi khác so với LWPOLYLINE một chút. Với LWPOLYLINE, tất cả các đỉnh đều có dạng (10 x y z), còn trong MLINE chỉ có đỉnh đầu tiên có dạng (10 x y z) còn các đỉnh sau đó đều có dạng (11 x y z). Sau đây là lệnh DAIMLINE để tính tổng chiều dài các MLINE được chọn:

(defun c:daimline ( / ss sdt tongdai index)
(defun daione (ent / pcu daiml p)
(defun adp (pt)
(cond ((= 10 (car pt))
(setq pcu (cdr pt)
daiml 0.0
)
)
((= 11 (car pt))
(setq
p (cdr pt)
daiml (+ daiml (distance p pcu))
pcu p
)
)
)
)
(setq tt (entget ent))
(foreach pt tt
(adp pt)
)
daiml
)
(setq ss (ssget '((0 . "MLINE")))
sdt (cond
(ss (sslength ss))
(t 0)
)
index 0
tongdai 0.0
)
(repeat sdt
(setq ent (ssname ss index)
index (1+ index)
tongdai (+ tongdai (daione ent))
)
)
(princ (strcat "\nTong chieu dai cac MLine tren la: "
(rtos tongdai 2 2)
)
)
(princ)
)



Em cảm ơn bác Hoành nhiều nhé. Em tính chiều dài LWPOLYLINE bằng lệnh Area sau đó truy xuất biến hệ thống PERIMETER. Em đang cố gắng học nên chưa thành thạo trong việc xử lý Record.
Chúc bác luôn vui.
  • 0

#5 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 16 May 2007 - 05:05 PM

Em cảm ơn bác Hoành nhiều nhé. Em tính chiều dài LWPOLYLINE bằng lệnh Area sau đó truy xuất biến hệ thống PERIMETER. Em đang cố gắng học nên chưa thành thạo trong việc xử lý Record.
Chúc bác luôn vui.


Nếu để tính chiều dài bằng lệnh kết hợp biến hệ thống, bạn nên dùng lệnh Lengthen. Lệnh lengthen ngoài tính được chiều dài của polyline, circle còn tính được chiều dài của line, arc, spline. Cách dùng giống hệt như với lệnh AREA.
  • 0

#6 Bommak

Bommak

    biết vẽ line

  • Members
  • PipPip
  • 25 Bài viết
Điểm đánh giá: 1 (bình thường)

Đã gửi 16 May 2007 - 06:20 PM

Nếu để tính chiều dài bằng lệnh kết hợp biến hệ thống, bạn nên dùng lệnh Lengthen. Lệnh lengthen ngoài tính được chiều dài của polyline, circle còn tính được chiều dài của line, arc, spline. Cách dùng giống hệt như với lệnh AREA.



Quá hay, bác đúng là Master. Từ trước đến giờ em chưa bao giờ dùng cái lệnh Lengthen này cả. Hỏi bác 1 câu hỏi mà lại học thêm được mấy "võ" liền, lãi quá bác ạ... :ph34r: :s_dead:
  • 0