Đến nội dung


Hình ảnh
- - - - -

lay toa do dinh cua duong polyline


  • Please log in to reply
7 replies to this topic

#1 akita13

akita13

    biết pan

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

Đã gửi 24 March 2011 - 04:43 PM

Chào các bác!
Em đang viết một đoạn code để lấy toạ độ của đường polyline.Em lay toa do cua mot diem sau do dung lenh entdel de xoa diem do ra khoi danh sach va thuc hien vong lap de lay diem tiep theo.lam mai ma khong thuc hien duoc ma em van chua tim duoc loi o dau.mong cac bac giup do em hoan thien tiep bai toan.Em xin cam on!
P/S:bac nao co doan lisp tuong tu thi cho e xin.
Đoạn code như sau:
[code]
(defun C:xyz (/ fn f ss b c d e f g p1x p1y p1z p2x p2y p2z O)
(prompt "\nPick Line to get Extract X-Y-Z points:")
(setq ss (ssget))
(setq fn (getfiled "ghi toa do ra file " "toa_do_diem" "txt" 1))
(setq f (open fn "w"))
(write-line fn f)
(write-line (strcat "STT" "\t\t" "x" "\t\t" "y") f)
(setq e (ssname ss 0))
(setq c (entget e))
(while (car (assoc 10 c))
(setq p1x (car (cdr (assoc 10 c))) p1y (cadr (cdr (assoc 10 c))) p1z (caddr (cdr (assoc 10 c))))
(if (and (/= p1x nil)(/= p1y nil)(/= p1z nil))
(progn
(prompt "\nEndpoint 1 = ")
(setq O (strcat (rtos p1x) "\t" (rtos p1y) "\t" (rtos p1z)))
(prompt (strcat "\n" O))
(prompt str)
(write-line str f)
); end progn
); end if
(entdel p1x c)
(entdel p1y c)
(entdel p1z c)
); end while
(close f)
(startapp "C:\\windows\\Notepad.exe" fn)
(princ)
); end function
[code]
  • 0

#2 hochoaivandot

hochoaivandot

    biết dimradius

  • Members
  • PipPipPipPipPip
  • 310 Bài viết
Điểm đánh giá: 107 (tàm tạm)

Đã gửi 24 March 2011 - 05:38 PM

Chào các bác!
Em đang viết một đoạn code để lấy toạ độ của đường polyline.Em lay toa do cua mot diem sau do dung lenh entdel de xoa diem do ra khoi danh sach va thuc hien vong lap de lay diem tiep theo.lam mai ma khong thuc hien duoc ma em van chua tim duoc loi o dau.mong cac bac giup do em hoan thien tiep bai toan.Em xin cam on!
P/S:bac nao co doan lisp tuong tu thi cho e xin.



(defun C:plnod()
(setq tt (entget (car (entsel "\nPick pline: ")))) ;; Lấy thông tin đối tượng
(setq tt (vl-remove-if '(lambda (x) (/= 10 (car x))) tt)) ;; Loại các phần tử list không mang dữ liệu đỉnh
(setq dinh1 (cdr (nth 1 tt))) ;; gán biến dinh1 cho tọa độ đầu tiên
)
Bạn tham khảo lisp cua anh Hoành áp dụng cho polyline ở trên. hoặc lisp sau của 1 cụ ở nước ngoài áp dụng cho cả LWpolyline và polyline

(defun C:nod()
(setq en(car(entsel "\n Select a PolyLine: ")))
(setq enlist(entget en))
(setq ptList(list))
(setq en2(entnext en))
(setq enlist2(entget en2))
(while (not (equal (cdr(assoc 0 (entget(entnext en2))))"SEQEND"))
(setq en2(entnext en2))
(setq enlist2(entget en2))
(if(/= 16 (cdr(assoc 70 enlist2)))
(setq ptList(append ptList (list (cdr(assoc 10 enlist2)))))
)
)
)

  • 1

Dương Bá Diệp

 

www.cadonline.duyxuyen.vn 

 

Thành viên nhóm CADMAGIC

 


#3 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 24 March 2011 - 08:27 PM

@ Mình có mấy lời tâm sự cùng bạn akita :
1- Bạn có phần hơi nhảy cóc. Giải quyết 1 vấn đề lớn bạn hãy đi từ từng mục nhỏ trước. Ở lisp này, việc bạn cần làm trước tiên là lấy tọa độ đỉnh đã, rồi sau đó hãy tính tới việc ghi file dựa vào cấu trúc kết quả thu được.Vấn đề 1 chưa xong, trộn vào vấn đề 2, mỗi lần test lại 1 lần open/ write, vừa bất tiện vừa không hợp lý để dò lỗi
2- Vấn đề lấy list tọa độ đỉnh thì trên diễn đàn nhiều tương đối rồi, nếu bạn tìm chắc chắn sẽ thấy cái mình cần
3- Nếu máy bạn có bộ express,thì chỉ cần 1 dòng thôi :

(acet-geom-vertex-list (car(entsel)))


  • 1

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC


#4 akita13

akita13

    biết pan

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

Đã gửi 24 March 2011 - 10:45 PM

@ Mình có mấy lời tâm sự cùng bạn akita :
1- Bạn có phần hơi nhảy cóc. Giải quyết 1 vấn đề lớn bạn hãy đi từ từng mục nhỏ trước. Ở lisp này, việc bạn cần làm trước tiên là lấy tọa độ đỉnh đã, rồi sau đó hãy tính tới việc ghi file dựa vào cấu trúc kết quả thu được.Vấn đề 1 chưa xong, trộn vào vấn đề 2, mỗi lần test lại 1 lần open/ write, vừa bất tiện vừa không hợp lý để dò lỗi
2- Vấn đề lấy list tọa độ đỉnh thì trên diễn đàn nhiều tương đối rồi, nếu bạn tìm chắc chắn sẽ thấy cái mình cần
3- Nếu máy bạn có bộ express,thì chỉ cần 1 dòng thôi :

thanks 2 bac rat nhieu.
@ketxu:
thanks bác đã góp ý.Em đã làm một thử lisp lấy toạ độ đỉnh rồi nhưng chỉ ghi được toạ độ của đỉnh đầu tiên.Việc lấy toạ độ đỉnh tiếp theo em vẫn chưa lấy được.Em dùng thử lệnh entdel nhung ko duoc.Mong bác giúp em định hướng tiếp.
  • 0

#5 phamngoctukts

phamngoctukts

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1107 Bài viết
Điểm đánh giá: 696 (tốt)

Đã gửi 24 March 2011 - 10:59 PM

thanks 2 bac rat nhieu.
@ketxu:
thanks bác đã góp ý.Em đã làm một thử lisp lấy toạ độ đỉnh rồi nhưng chỉ ghi được toạ độ của đỉnh đầu tiên.Việc lấy toạ độ đỉnh tiếp theo em vẫn chưa lấy được.Em dùng thử lệnh entdel nhung ko duoc.Mong bác giúp em định hướng tiếp.

Sao bạn lại dùng entdel phải dùng entnext chứ.
  • 0
Tất cả vì sự phát triển của diễn đàn ...
Cám ơn đừng nói lời suông mà hãy nhấn Hình đã gửi!

#6 akita13

akita13

    biết pan

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

Đã gửi 25 March 2011 - 01:13 AM

@phamngoctukts:thanks bac,de em thu thay lenh entnext xem.Em moitap viet lisp nen chua bik duoc nhieu lenh.co j cac bac chj giup them.
theo ham cua bac ketxu em đã xuất được toạ độ điểm của polyline ra txt.Nhưng trong file txt có một vài số bị lệch.Các bác giúp e sửa lỗi này với.Em xin cam on.
Đây là đoạn lisp em đã viết:
toa_do_dinh
  • 0

#7 ThuyLinh313

ThuyLinh313

    biết lệnh mtext

  • Members
  • PipPipPipPip
  • 288 Bài viết
Điểm đánh giá: 142 (tàm tạm)

Đã gửi 25 March 2011 - 01:29 AM

Sao bạn lại dùng entdel phải dùng entnext chứ.

Nếu là Polyline thì mới dùng entnext để ra ename các đỉnh (gọi đúng hơn là vertext) tiếp theo. còn với lwpolyline thì entnext nó sẽ ra ename của đối tượng tiếp theo.
@akita: Chào bạn, mình xem qua 1 chút lisp của bạn thì thấy vấn đề của bạn chính là đoạn này, các đoạn khác mình không có thời gian xem
(while (car (assoc 10 c))
(setq p1x (car (cdr (assoc 10 c))) p1y (cadr (cdr (assoc 10 c))) p1z (caddr (cdr (assoc 10 c))))
(if (and (/= p1x nil)(/= p1y nil)(/= p1z nil))
(progn
(prompt "\nEndpoint 1 = ")
(setq O (strcat (rtos p1x) "\t" (rtos p1y) "\t" (rtos p1z)))
(prompt (strcat "\n" O))
(prompt str)
(write-line str f)
); end progn
); end if
(entdel p1x c)
(entdel p1y c)
(entdel p1z c)
); end while

có vài điều bạn cần chú ý như sau:
- về hàm Assoc: hàm này sẽ lấy ra list con duy nhất được tìm thấy đầu tiên thỏa mãn điều kiện lọc (ở đây là mã DXF 10) trong 1 list lớn chứa nó.
vì thế để lấy ra được tất cả các list có mã 10 bạn có thể thay đoạn code này:
(while (car (assoc 10 c))... bằng đoạn code này (foreach li c (if (= (car li) 10)...
- Bạn hiểu sai về hàm Entdel. nó không phải là hàm loại 1 phần tử ra khỏi 1 list. Nó là hàm dùng để xóa 1 đối tượng trên bản vẽ. Cấu trúc của nó như thế này:(entdel Ename) trong đó Ename là tên của đối tượng muốn xóa. nếu bạn entdel 1 đối tượng đã bị xóa rồi thì nó có chức năng ngược lại, là khôi phục đối tượng đã xóa.
  • 0

#8 ketxu

ketxu

    Copier - Paster - Editor

  • Moderator
  • PipPipPipPipPipPipPip
  • 5682 Bài viết
Điểm đánh giá: 2605 (tuyệt vời)

Đã gửi 25 March 2011 - 08:32 AM

@phamngoctukts:thanks bac,de em thu thay lenh entnext xem.Em moitap viet lisp nen chua bik duoc nhieu lenh.co j cac bac chj giup them.
theo ham cua bac ketxu em đã xuất được toạ độ điểm của polyline ra txt.Nhưng trong file txt có một vài số bị lệch.Các bác giúp e sửa lỗi này với.Em xin cam on.
Đây là đoạn lisp em đã viết:
toa_do_dinh

Đó chỉ là vấn đề trình bày. Bạn đẩy "x" "y" thành " x " " y " chẳng hạn là đẹp đẽ ngay ^^. Nếu làm cặn kẽ thì có thể đếm số chữ số trong tọa độ để chia ra cho đẹp
  • 0

Thành viên nhóm CadMagic.
Mời bạn ghé thăm facebook nhóm - Page viết lisp theo yêu cầu  :
CAD MAGIC