Đến nội dung


Hình ảnh
- - - - -

[Yêu cầu] Nhờ viết lisp chèn nhanh point vào End_point đối tượng


  • Please log in to reply
14 replies to this topic

#1 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 17 June 2015 - 03:54 PM

Mình có nhu cầu sử dụng nhiều tình huống là chèn nhanh các đối tượng point của cad vào các điểm end_point của đối tượng. Từ đối tượng point chèn vào mình có thể xử lý được nhiều tình huống kế tiếp với các lisp khác của cadviet. 

Vậy nên kính mong các bác viết dùm mình lisp chèn nhanh point cụ thể như sau:

+lisp add_point_object:

Chọn đối tượng

Đầu vào các loại đối tượng vẽ (line, arc, circle, ellipse, polyline, ray)

Kết quả là các point được add thêm vào tại các vị trí end_point của các đối tượng đầu vào ạ.

Mình xin chân thành cảm ơn các bác trước ạ. 


  • 0

#2 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 17 June 2015 - 04:40 PM

 End_point của những thằng này:  (circle, ellipse, ray) bạn xác định nó nằm chỗ nào???


  • 0

#3 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 17 June 2015 - 05:03 PM

À cái đó thì có circle thì không có endpoint thôi; cái này mình bị nhầm lẫn. Còn ellipse thì trong trường hợp nó bị cắt thành cung ellipse thì nó vẫn có end point. Còn ray thì luôn có 1 end point mà.


  • 0

#4 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 17 June 2015 - 06:07 PM

Đây bạn (bạn tự kiểm soát enpoint và startpoint nhé!):

(defun c:APO (/ i ss ent obj S-point E-point I-point add_point_object ename)
(defun add_point_object (obj)
(setq obj (vlax-ename->vla-object ent)
S-point (vlax-curve-getstartpoint obj)
E-point (vlax-curve-getendpoint obj))
(cond ((eq ename "ARC") (setq I-point S-point))
((eq ename "RAY") (setq I-point S-point))
(t (setq I-point E-point)))
(entmakex (list '(0 . "POINT") '(100 . "AcDbEntity") '(100 . "AcDbPoint") (cons 10 I-point))))
;; main
(if (setq i 0
ss (ssget "_:L" '((0 . "*LINE,ARC,ELLIPSE,RAY,CIRCLE")))
n (sslength ss))
(progn (while (< i n)
(setq ent (ssname ss i)
ename (cdr (assoc 0 (entget ent))))
(add_point_object obj)
(setq i (1+ i)))))
(princ))


  • 1

#5 victor85

victor85

    biết lệnh stretch

  • Members
  • PipPipPip
  • 169 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 22 June 2015 - 10:42 PM

Mình xin cảm ơn bác quocmanh04tt nhé. Lisp chạy ổn rồi nhưng chưa đúng ý diễn tả mình lắm. Cái mình mong muốn là end_point là cả start và end point giống như trong chế độ bắt điểm end point thôi ấy. Bác chỉnh thêm 1 chút dùm mình được không ạ? 


  • 0

#6 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 23 June 2015 - 09:28 AM

Mình xin cảm ơn bác quocmanh04tt nhé. Lisp chạy ổn rồi nhưng chưa đúng ý diễn tả mình lắm. Cái mình mong muốn là end_point là cả start và end point giống như trong chế độ bắt điểm end point thôi ấy. Bác chỉnh thêm 1 chút dùm mình được không ạ?

Ôi... Cái End_point... Của bạn đây:
(defun c:APO (/ i ss ent obj S-point E-point add_point_object ename)
(defun add_point_object (obj / make_po)
(defun make_po (point)
(entmakex (list '(0 . "POINT") '(100 . "AcDbEntity") '(100 . "AcDbPoint") (cons 10 point))))
(setq obj (vlax-ename->vla-object ent)
S-point (vlax-curve-getstartpoint obj)
E-point (vlax-curve-getendpoint obj))
(cond ((or (eq ename "CIRCLE") (eq ename "ELLIPSE") (eq ename "RAY")) (make_po S-point))
(t (make_po E-point) (make_po S-point))))
;; main
(if (setq i 0
ss (ssget "_:L" '((0 . "*LINE,ARC,ELLIPSE,RAY,CIRCLE")))
n (sslength ss))
(progn (while (< i n)
(setq ent (ssname ss i)
ename (cdr (assoc 0 (entget ent))))
(add_point_object obj)
(setq i (1+ i)))))
(princ))

  • 0

#7 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 23 June 2015 - 09:39 AM

Chú ý thêm trường hợp ellipse hở (ellipse bị break hoặc vẽ arc ellipse).


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#8 gia_bach

gia_bach

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 1435 Bài viết
Điểm đánh giá: 1426 (rất tốt)

Đã gửi 23 June 2015 - 09:56 AM

Ôi... Cái End_point... Của bạn đây:

(defun c:APO (/ i ss ent obj S-point E-point add_point_object ename)
(defun add_point_object (obj / make_po)
(defun make_po (point)
(entmakex (list '(0 . "POINT") '(100 . "AcDbEntity") '(100 . "AcDbPoint") (cons 10 point))))
(setq obj (vlax-ename->vla-object ent)
S-point (vlax-curve-getstartpoint obj)
E-point (vlax-curve-getendpoint obj))
(cond ((or (eq ename "CIRCLE") (eq ename "ELLIPSE") (eq ename "RAY")) (make_po S-point))
(t (make_po E-point) (make_po S-point))))
;; main
(if (setq i 0
ss (ssget "_:L" '((0 . "*LINE,ARC,ELLIPSE,RAY,CIRCLE")))
n (sslength ss))
(progn (while (< i n)
(setq ent (ssname ss i)
ename (cdr (assoc 0 (entget ent))))
(add_point_object obj)
(setq i (1+ i)))))
(princ))

Lisp chạy ổn, 

nhưng cách viết và sử dụng hàm con (tên biến) trông như đánh đố đấy nhỉ ???


  • 1

#9 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 23 June 2015 - 10:56 AM

Đang tập tành học hỏi mà bác! Có gì nhờ các bác chỉ giáo thêm.


  • 0

#10 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 23 June 2015 - 11:00 AM

Chú ý thêm trường hợp ellipse hở (ellipse bị break hoặc vẽ arc ellipse).

 


 

Chú ý thêm trường hợp ellipse hở (ellipse bị break hoặc vẽ arc ellipse).

Cám ơn bác, em không để ý. Nên dùng cách gì để lấy thêm trường hợp này ạ?


  • 0

#11 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 23 June 2015 - 11:03 AM

Theo tôi, với 1 obj bạn lấy cả end và start. Sau đó xét cái nào khác nil thì vẽ. 


  • 0

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#12 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 23 June 2015 - 11:19 AM

Đúng là như vậy, nhưng có trường hợp end và start trùng nhau, em muốn loại 1 thằng point.


  • 0

#13 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 23 June 2015 - 11:28 AM

Sửa lại và xin các bác cho ý kiến.
(defun c:APO (/ i ss ent obj S-point E-point add_point_object ename)
(defun add_point_object (obj / make_po)
(defun make_po (point)
(entmakex
(list '(0 . "POINT") '(100 . "AcDbEntity") '(100 . "AcDbPoint") (cons 10 point) (cons 62 1))))
(setq obj (vlax-ename->vla-object ent)
S-point (vlax-curve-getstartpoint obj)
E-point (vlax-curve-getendpoint obj))
(cond ((or (eq ename "CIRCLE") (eq ename "RAY")) (make_po S-point))
((or(eq ename "ELLIPSE") (eq ename "LWPOLYLINE"))
(if (and(eq (car S-point) (car E-point))(eq (cadr S-point) (cadr E-point)))
(make_po S-point)
(progn (make_po S-point) (make_po E-point))))
(t (make_po E-point) (make_po S-point))))
;; main
(if (setq i 0
ss (ssget "_:L" '((0 . "*LINE,ARC,ELLIPSE,RAY,CIRCLE")))
n (sslength ss))
(progn (while (< i n)
(setq ent (ssname ss i)
ename (cdr (assoc 0 (entget ent))))
(add_point_object obj)
(setq i (1+ i)))))
(princ))

Bài viết đã được chỉnh sửa nội dung bởi quocmanh04tt: 23 June 2015 - 04:22 PM

  • 1

#14 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 5448 Bài viết
Điểm đánh giá: 2624 (tuyệt vời)

Đã gửi 23 June 2015 - 11:32 AM

Dùng hàm bằng "=" cho số thực là rất nguy hiểm, nên equal.


  • 2

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#15 quocmanh04tt

quocmanh04tt

    biết lệnh imageclip

  • Members
  • PipPipPipPipPipPipPip
  • 673 Bài viết
Điểm đánh giá: 314 (khá)

Đã gửi 23 June 2015 - 11:38 AM

Dùng hàm bằng "=" cho số thực là rất nguy hiểm, nên equal.

Vâng cám ơn bác!
  • 0