Đến nội dung


Hình ảnh
- - - - -

Lisp nối Line thành Pline ?


  • Please log in to reply
80 replies to this topic

#61 sgcq

sgcq

    Hội Hai Lúa

  • Members
  • PipPipPipPipPipPipPip
  • 1880 Bài viết
Điểm đánh giá: 692 (tốt)

Đã gửi 08 April 2014 - 03:35 PM

Nhân đề nghị của anh 2 lúa cad nông dân bên trên tôi làm thêm 1 bước nữa, chỉ cần đánh lệnh test nó sẽ tự động nối line,arc.

Nhưng tôi chưa có file line arc số lượng lớn để test, bạn nào có file lớn đưa lên để test thử. File lisp như sau:

 

 

(defun c:test(/ kc L1 L2 tieptuc tm1 tm2 tm ng obj)
  (defun noithem(d v kc tr / tm tm1)
    (if (setq tm (car (vl-remove nil
(mapcar '(lambda(x) (if (and (/= v (cadar x))
    (or (<= (distance d (car x)) kc) (<= (distance d (last x)) kc))) x nil)) L1))))
    (if (or (and tr (<= (distance d (car tm)) kc)) 
            (and (not tr) (<= (distance d (last tm)) kc)))
    (setq ng t tm1 (reverse tm))
    (setq ng nil tm1 tm)))
  )
  
  (defun ssfrom (sl / ss0) (setq ss0 (ssadd)) (foreach v sl (ssadd v ss0)) ss0)
  ;;;
  (setq kc (getreal "\nNhap khoang ho cho phep de noi:")
L1 (mapcar '(lambda(x) (list (vlax-curve-getStartPoint (setq obj (vlax-ename->vla-object x))) x
(vlax-curve-getEndPoint obj))) (acet-ss-to-list (ssget "X" '((0 . "LINE,ARC")))))
L2 (list (car L1))
L1 (cdr L1))
  (setvar "cmdecho" 0)
  (while L1
    (setq tieptuc t)
    (while tieptuc      
      (if (setq tm1 (noithem (caar L2) (cadar L2) kc t))
        (setq L2 (cons tm1 L2) L1 (vl-remove (if ng (reverse tm1) tm1) L1)))
      (if (setq tm2 (noithem (last (last L2)) (cadr (last L2)) kc nil))
        (setq L2 (append L2 (list tm2)) L1 (vl-remove (if ng (reverse tm2) tm2) L1)))
      (if (and (not tm1)(not tm2))
(setq tieptuc nil
     tm (COMMAND ".PEDIT" "M" (ssfrom (mapcar 'cadr L2)) ""  "Y" "J" kc "")
     L2 (list (car L1))
     L1 (cdr L1)))
    )
  )
  (setvar "cmdecho" 1)
)
 

:D :D :D

Đây là file ví dụ:

http://www.cadviet.c...ankiempart1.rar

http://www.cadviet.c...ankiempart2.rar

2 lúa chỉ cần gõ lệnh, chọn option thì sẽ tự động nối. 

Việc line, arc nào là lề đường, line arc nào là thửa tất nhiên 2 lúa sẽ tự lo;

 

2 lúa đề xuất cái này như 1 dạng option, không phải là 1 lisp riêng. 

Vì nhiều bạn vẫn cần lisp có thể pick được từng line rồi nối lại.

Riêng 2 lúa lại cần tổng thể hơn một chút.

 

Với lisp đã có sẵn, 2 lúa thấy nó chạy rất ổn.

Nhưng với file như trên, 2 lúa phải tốn thêm khoảng 30 ngày mới có thể pick hết các line. :D

:D :D :D


  • -1

12728974_230210507314169_718723558582070 HỘI HAI LÚA

           fanpage: https://www.facebook.com/HoiHaiLua/

 

 

 

 

 

 


#62 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 08 April 2014 - 03:36 PM

Thực sự về mặt vị trí thì nó trùng nhau, nhưng về cơ sở dữ liệu thì khác nhau xa. Cad chỉ quản lý số liệu thôi chứ nó không có khái niệm trùng hay không. Có thể dùng hàm trans để chuyển đổi các điểm về WCS thì ct vẫn nhận ra 2 vật kề nhau, nhưng khi dùng lệnh pedit thì không được, vì trong data của cad hiểu là nó quá xa nhau. 

Bạn thử dùng trans để chuyển ds2 của cái đường đó về WCS xem sao.


  • 0

#63 Polyline

Polyline

    biết lệnh mirror

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

Đã gửi 08 April 2014 - 04:41 PM

Dùng hàm (trans với tham số nào vậy bạn?


  • 0

#64 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 April 2014 - 05:01 PM

Với bản vẽ Polime gởi lên:

Bạn lần lượt cho vào command 3 dòng code sau:

 

(command "._UCS" "_FRONT")

(command "._MIRROR" "_SI" (ssget"X"'((210 0 0 -1))) '(0 0)'(1 0)"_YES")
(command "._UCS" "_PREVIOUS")

Bây giờ có thể PEDIT.


  • 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.


#65 Polyline

Polyline

    biết lệnh mirror

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

Đã gửi 08 April 2014 - 05:16 PM

Với bản vẽ Polime gởi lên:

Bạn lần lượt cho vào command 3 dòng code sau:

 

(command "._UCS" "_FRONT")

(command "._MIRROR" "_SI" (ssget"X"'((210 0 0 -1))) '(0 0)'(1 0)"_YES")
(command "._UCS" "_PREVIOUS")

Bây giờ có thể PEDIT.

Thì nó cũng như endmod với 2 mã 10 và 210 thôi mà! Mình đọc trong Help của AutoCAD nhưng phần nói về mã 210 rất ít.


  • 0

#66 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 08 April 2014 - 05:18 PM

Thì nó cũng như endmod với 2 mã 10 và 210 thôi mà! Mình đọc trong Help của AutoCAD nhưng phần nói về mã 210 rất ít.

Vậy thì bạn cứ thử làm như chữ "cũng như" đi xem nó ra cái gì nhé!


  • 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.


#67 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 08 April 2014 - 06:44 PM

Những trị số dxf 10 khi lấy bằng hàm entget đều là ở tọa đô hệ trục WCS.

Khi cad muốn thể hiện vị trí thực của 1 điểm pt  nào đó trên màn hình nó sẽ sử dụng hàm trans như sau :

 

(trans pt 0 '(0.0 0.0 -1.0))

 

trong đó số 0  là tham số chỉ  hệ WCS, còn  '(0.0 0.0 -1.0) chính là cái nằm sau dxf 210 trong entget.

Khi đó nó sẽ cho ra vị trí của điểm trên màn hình (là vị trí mà bạn rê tới rê lui đó). Nhưng thực chất nó nằm tận đâu đâu nếu bạn đổi dxf 210, khi đó nó là vị trí thực trong hệ WCS . 

 

Cái hàm trans trên cũng cho ra trị số tương đương với trị của các hàm vlax-curve-getStartPoint và Endpoint và đó là tọa độ điểm trên màn hình. Nhưng khi pedit thì cad chỉ dùng trị số trong entget cho nên vị trí thật quá xa không nối được.

 

 


  • 0

#68 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 08 April 2014 - 08:25 PM

Bạn dùng hàm này có thể giữ cho cái arc của bạn nằm im không bị văng đi mất sau khi đổi dxf 210.

Trị số dxf 10 thì ok, nhưng còn dxf 42 nếu giữ nguyên thì arc sẽ bị ngược. Tôi lấy giá trị ngược dấu thì nó ok, nhưng tôi không chắc lắm lấy như vậy có đúng không. Bạn thử kiếm thêm vài đối tượng arc để test.

 

(defun doiucs(v / L tm)
  (setq L (entget v))
  (entmod (subst '(210 0.0 0.0 1.0) (setq tm (assoc 210 L))
(mapcar '(lambda(x) (cond ((= 10 (car x)) (cons 10 (trans (cdr x) (cdr tm) 0)))
 ((and (= 42 (car x)) (/= 0 (cdr x))) (cons 42 (- (cdr x))))
 (t x))) L)))
)

  • 0

#69 Polyline

Polyline

    biết lệnh mirror

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

Đã gửi 09 April 2014 - 03:11 PM

Bạn Tot77 nhiệt tình và uyên bác quá! :)


  • 0

#70 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 09 April 2014 - 04:06 PM

Cái này đổi UCS mọi đối tượng có DXF 210 là (210 0 0 -1):

(defun C:HA ( / ss)
 (if (setq ss (ssget (list '(210 0 0 -1))))
  (command "ucs" "3p" (trans '(0 0 0) 0 1) (trans '(0 1 0) 0 1) (trans '(0 0 1) 0 1) "mirror" ss "" '(0 0 0) '(1 0 0) "y" "ucs" "p")))
 


  • 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.


#71 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 09 April 2014 - 04:59 PM

@Polyline : Cám ơn lời khen của bạn, cũng chẳng phải uyên bác gì đâu. Trước khi trả lời topic này thật sự tôi cũng chẳng biết gì về dxf 210 ( vì có bao giờ đụng tới nó đâu). Nhưng cái gì không biết thì hỏi google, trang trong nước không có thì vào trang nước ngoài, tìm hiểu rồi test, thấy ok thì post lên thôi.


  • 1

#72 ndtnv

ndtnv

    biết lệnh minsert

  • Members
  • PipPipPipPipPipPip
  • 437 Bài viết
Điểm đánh giá: 384 (khá)

Đã gửi 14 April 2014 - 01:22 PM

Lệnh PEDIT chỉ nối được các đối tượng nằm trên cùng 1 mp.

CAD xem các đối tượng có DXF 210 = (0,0,-1) không cùng mp Oxy của WCS vì hướng của các vector pháp tuyến khác nhau.

Hệ tọa độ OCS được xác định từ vector đơn vị Oz trong DXF 210 và các thành phần khác trong DXF 10, 11, 38...( tùy loại đối tượng)

Cách xác định gốc tọa độ và 2 vector đơn vị còn lại tôi đã đọc nhưng vì Lisp đã có hàm convert nên tôi cũng không nghiên cứu thêm (chưa rãnh để tìm lại link).

Lisp của bạn Tot77:

- Không dùng được cho các đối tượng khác như LINE, ARC ...

- Sai khi DXF 38 /= 0

Lisp của bạn Doan Van Ha:

- Đổi cả các đối tượng không mong muốn như Block

- Sai khi các đối tượng nằm ngoài mp Oxy hoặc block có chứa đối tượng nằm ngoài mp Oxy của WCS

- UCS + MIRROR + UCS  <=> MIRROR3D


  • 1

#73 HAIR

HAIR

    biết pan

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

Đã gửi 27 November 2014 - 04:08 PM

http://www.cadviet.c...02_drawing1.dwgEm xin nhờ anh chị viết hộ lisp tạo đường pline bao vùng giới hạn tạo bởi các line và pline cắt nhau như hình dưới.

Cụ thể: 

+ B1: Chọn các đường line, pline giao nhau

+ B2: Chạy lisp

E chân thành cảm ơn!

untitled_zps87f078e4.png


  • 0

#74 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 27 November 2014 - 04:52 PM

Vì bạn không post file nên mình không test được, bạn thử làm cách này được không, không cần lisp:

1. Vẽ hình chữ nhật bao quan cái hình trên của bạn (Bao rộng hẳn ra bên ngoài, không chạm vào đường nào)

2. Dùng lệnh Bo pick vào vùng giữa hình của bạn và hình chữ nhật vừa tạo.

3. Bạn sẽ có được đường bo bạn cần.


  • 0

#75 HAIR

HAIR

    biết pan

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

Đã gửi 27 November 2014 - 05:03 PM

Vì bạn không post file nên mình không test được, bạn thử làm cách này được không, không cần lisp:

1. Vẽ hình chữ nhật bao quan cái hình trên của bạn (Bao rộng hẳn ra bên ngoài, không chạm vào đường nào)

2. Dùng lệnh Bo pick vào vùng giữa hình của bạn và hình chữ nhật vừa tạo.

3. Bạn sẽ có được đường bo bạn cần.

Không được bạn à. Cảm ơn bạn n


  • 0

#76 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 28 November 2014 - 08:36 AM

Bạn đã thử thật chưa?

 

1969_untitled.gif


  • 1

#77 HAIR

HAIR

    biết pan

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

Đã gửi 28 November 2014 - 10:33 AM

cám ơn bạn conghoa n. Đúng là phải thay đổi cách nhìn một việc theo cách cũ.


  • 0

#78 HAIR

HAIR

    biết pan

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

Đã gửi 28 November 2014 - 10:55 AM

Thật ra trường hợp của mình khá phức tạp. Theo cách của bạn conghoa vẫn không được vì còn có nhiều đường khác nữa. Bạn xem giúp mình:

untitled_zps59ea5bcd.pnghttp://www.cadviet.c..._drawing1_1.dwg


  • 0

#79 conghoa

conghoa

    biết lệnh attdef

  • Members
  • PipPipPipPipPipPip
  • 411 Bài viết
Điểm đánh giá: 88 (tàm tạm)

Đã gửi 28 November 2014 - 01:55 PM

lisp ẩn hiện đối tương bạn vào http://www.cadviet.c...e-show-object/ 

tên lệnh bạn tự chỉnh sửa cho hợp

 

1969_boundary.gif


  • 1

#80 HAIR

HAIR

    biết pan

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

Đã gửi 30 November 2014 - 10:18 PM

Cảm ơn bác conghoa


  • 0