Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết lisp theo yêu cầu [phần 2]

Các bài được khuyến nghị

@Yes : Lisp ẩn đối tượng theo màu trên diễn đàn đã có. Bạn chịu khó Tìm kiếm vậy

1. Cám ơn bạn đã hướng dẫn. Mình đã tìm trên diễn đàn nhưng không có. Chỉ có lisp tạo layer theo color nhưng lại bị lỗi. Mình cũng đang cần, bạn có thể sửa lai lỗi giúp mình không.

 

(Defun c:MRL ()

(princ "\nPHAM QUOC DUY Binh Son - Quang ngai")

(setq XX (ssget "x"))

(setq L 0)

(setq M (sslength XX))

(while (< L M)

(setq DT (ssname XX L))

(setq DTM (entget DT))

(setq TEXT (cdr (assoc 10 DTM)))

(setq MAUDt (cdr (assoc 62 DTM)))

 

(command "-layer" "new" MAUDT "color" MAUDT MAUDT "")

(command ".chprop" DT "" "la" MAUDT "COLOR" "BYLAYER" "")

(setq L (1+ L))

)

 

(setq nhan (* l 100))

(setq chia (/ nhan m))

(princ (strcat "\nDa chinh: <" (itoa chia) " %>"))

 

(Princ)

)

2. Nhờ bạn viết giúp mình Lisp ẩn hiện đối tượng theo màu. Cảm ơn bạn đã quan tâm.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
2. Nhờ bạn viết giúp mình Lisp ẩn hiện đối tượng theo màu. Cảm ơn bạn đã quan tâm.

 

Bạn theo cái này thử. kết hợp với fi của CAD nữa là Ê Kô

http://www.cadviet.com/forum/index.php?showtopic=279

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Mình nhờ bạn 1 tí nữa, vấn đề là mình vẽ bản vẽ qui hoạch, những cái qui hoạch lớn mình thống kê hiện trạng rất là mệt.

mình có 1 file:http://www.cadviet.com/upfiles/2/goi_cadviet.rar

trong đó có 5 polyline khép kín, trong mỗi polyline có từ 1 đến 5 hình tròn, mình muốn xin 1 cái lip khi ra lệnh nó sẽ tự dò trong mỗi polyline nếu có 1 hình tròn thì tạo ra 1 layer mới đặt tên là 1T chẳng hạn và đưa vòng tròn đó và polyline về layer 1T, tương tự cho polyline có 2 hình tròn thì 2T, polyline có 3 hình tròn thì 3T,...........

Chú ý là file qui hoạch thường rất nặng và rất dễ bị treo.Xin cám ơn

Mong các cao thủ giúp đỡ sớm, cám ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
1. Cám ơn bạn đã hướng dẫn. Mình đã tìm trên diễn đàn nhưng không có. Chỉ có lisp tạo layer theo color nhưng lại bị lỗi. Mình cũng đang cần, bạn có thể sửa lai lỗi giúp mình không.

 

(Defun c:MRL ()

(princ "\nPHAM QUOC DUY Binh Son - Quang ngai")

(setq XX (ssget "x"))

(setq L 0)

(setq M (sslength XX))

(while (< L M)

(setq DT (ssname XX L))

(setq DTM (entget DT))

(setq TEXT (cdr (assoc 10 DTM)))

(setq MAUDt (cdr (assoc 62 DTM)))

 

(command "-layer" "new" MAUDT "color" MAUDT MAUDT "")

(command ".chprop" DT "" "la" MAUDT "COLOR" "BYLAYER" "")

(setq L (1+ L))

)

 

(setq nhan (* l 100))

(setq chia (/ nhan m))

(princ (strcat "\nDa chinh: <" (itoa chia) " %>"))

 

(Princ)

)

2. Nhờ bạn viết giúp mình Lisp ẩn hiện đối tượng theo màu. Cảm ơn bạn đã quan tâm.

Lisp MRL bị lổi gì bạn?

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Lisp MRL bị lổi gì bạn?

Dòng lệnh sau chạy mãi không dừng. Bạn kiểm tra lại giúp minh nhé. Thank

 

Enter name list for new layer(s): Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:

color

New color [Truecolor/COlorbook] <7 (white)>: Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Bạn theo cái này thử. kết hợp với fi của CAD nữa là Ê Kô

http://www.cadviet.com/forum/index.php?showtopic=279

 

Thế thì phức tạp và mất thời gian lắm. Mình muốn chỉ dùng lệnh để bật tắt tất cả các đối tượng có cùng màu tương tự như lệnh layiso. Rất mong được các cao thủ giúp đỡ.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Thế thì phức tạp và mất thời gian lắm. Mình muốn chỉ dùng lệnh để bật tắt tất cả các đối tượng có cùng màu tương tự như lệnh layiso. Rất mong được các cao thủ giúp đỡ.

Tôi thấy có vẻ hơi khó (hoặc không thể thực hiện được) vì các đối tượng cùng màu nhưng lại nằm trên các lớp khác nhau, nhưng trên các lớp lại có nhiều đối tượng khác không cùng màu với đối tượng cần bật tắt.

Hiện tại tôi chỉ biết cách bật tắt lớp, còn bật tắt từng đối tượng thì chưa biết. Nếu có thể bật tắt từng đối tượng thì có thể giải quyết được vấn đề của bạn.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Giúp đỡ e 1 lisp về nội suy điểm. E có một bài toán thế này:

- Pick điểm P1 bất kỳ trong autocad, chỉ nhập thêm cao độ Z1 của điểm đó (user)

- Pick điểm P2 bất kỳ trong autocad, chỉ nhập thêm cao độ Z2 của điểm đó (user)

sau đó chọn điểm bất kỳ nằm trên đường thẳng P1P2, nội suy giá trị Z thông qua các giá trị P1(x1,y1,z1), P2 (x2, y2,z2) và P (x, y) (thuộc đường thẳng P1P2). Ghi giá trị Z nội suy được bằng text. (Các giá trị P này khi pick tùy ý thuộc P1P2)

 

Các bác giúp đỡ e với nhé

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Dòng lệnh sau chạy mãi không dừng. Bạn kiểm tra lại giúp minh nhé. Thank

 

Enter name list for new layer(s): Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:

color

New color [Truecolor/COlorbook] <7 (white)>: Enter an option

[?/Make/Set/New/ON/OFF/Color/Ltype/LWeight/Plot/Freeze/Thaw/LOck/Unlock/stAte]:

Do nhiều đối tượng nên hắn chạy lâu đó thôi chứ ko phải lổi. Ko biết có cách nào nhanh hơn ko chứ lisp này thì đúng là chờ mệt. Khi cần cải tạo bản vẽ của những người vẽ ko theo bài bản mình mới dùng lisp này nên cũng ko nghiên cứu thêm.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Mình nhờ các cao thủ 1 tí, vấn đề là mình vẽ bản vẽ qui hoạch, những cái qui hoạch lớn mình thống kê hiện trạng rất là mệt.

mình có 1 file: http://www.cadviet.com/upfiles/2/goi_cadviet.rar

trong đó có 5 polyline khép kín, trong mỗi polyline có từ 1 đến 5 hình tròn, mình muốn xin 1 cái lip khi ra lệnh nó sẽ tự dò trong mỗi polyline nếu có 1 hình tròn thì tạo ra 1 layer mới đặt tên là 1T chẳng hạn và đưa vòng tròn đó và polyline về layer 1T, tương tự cho polyline có 2 hình tròn thì 2T, polyline có 3 hình tròn thì 3T,...........

Chú ý là file qui hoạch thường rất nặng và rất dễ bị treo, các hình chữ nhật có thể bị nổ ra thành line và có thể bị hở nhỏ nữa .Xin cám ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
oh, lip rất hay, làm công việc của mình nhẹ đi phần nào, thật cám ơn.

Mình nhờ bạn 1 tí nữa, vấn đề là mình vẽ bản vẽ qui hoạch, những cái qui hoạch lớn mình thống kê hiện trạng rất là mệt.

mình có 1 file: http://www.mediafire.com/?nj1tmnvgneu.(xin lỗi cadviet ko hiểu vì sao mình ko upload được trên cadviet)

trong đó có 5 polyline khép kín, trong mỗi polyline có từ 1 đến 5 hình tròn, mình muốn xin 1 cái lip khi ra lệnh nó sẽ tự dò trong mỗi polyline nếu có 1 hình tròn thì tạo ra 1 layer mới đặt tên là 1T chẳng hạn và đưa vòng tròn đó và polyline về layer 1T, tương tự cho polyline có 2 hình tròn thì 2T, polyline có 3 hình tròn thì 3T,...........

Chú ý là file qui hoạch thường rất nặng và rất dễ bị treo.Xin cám ơn

 

Còn vấn đề này "các hình chữ nhật có thể bị nổ ra thành line và có thể bị hở nhỏ nữa" thì pótay !

Bạn thử LISP này :

(defun c:addLay (/ ent i j layname objci objpl pt_lst ss ssc)
 ;| By : Gia Bach, gia_bach @  www.CadViet.com             |;  
 (vl-load-com)

(defun GetPtLst (obj / anginc arcparam blg delta eparam inc pt ptlst sparam)
 (setq sparam (vlax-curve-getStartParam obj)
eparam (vlax-curve-getEndParam obj)
anginc (* pi (/ 6 180.0)))
 (while (<= sparam eparam)
   (setq pt (vlax-curve-getPointAtParam obj sparam))
   (if (not (equal pt (car ptlst) 1e-12))
     (setq ptlst (cons pt ptlst)))
   (if (and (/= sparam eparam)
      (setq blg (abs (vlax-invoke obj 'GetBulge sparam)))
      (/= 0 blg))
     (progn
(setq delta (* 4 (atan blg)) ;included angle
      inc (/ 1.0 (1+ (fix (/ delta anginc))))
      arcparam (+ sparam inc))
(while (< arcparam (1+ sparam))
  (setq pt (vlax-curve-getPointAtParam obj arcparam)
	ptlst (cons pt ptlst)
	arcparam (+ inc arcparam))))      )
   (setq sparam (1+ sparam))    )
 ptlst)
;main 
 (princ "\nChon Pline : ")
 (if (setq ss (ssget  '((0 . "LWPOLYLINE"))))
   (progn
     (setq i -1)
     (while (setq ent (ssname ss (setq i (1+ i))))
(setq objPL (vlax-ename->vla-object ent)
      pt_lst (GetPtLst objPL)
      ssC (ssget "_WP" pt_lst (list (cons 0 "CIRCLE"))) )
(if ssC
  (progn
    (setq num (sslength ssC))
    (if (> num 255) (setq num (rem num 255)))
    (setq layname (strcat "Layer_" (itoa num) "_Circle") j -1)
    (or (tblsearch "Layer" layname) (vl-cmdf "-layer" "N" layname "c" num layname ""))
    (vla-put-Layer objPL layname)
    (while (setq ent (ssname ssC (setq j (1+ j))))
      (setq objCi (vlax-ename->vla-object ent) )
      (vla-put-Layer objCi layname) ) ) ))))
 (princ))

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cho mình hỏi, ví dụ mình có 10 pline đã được DIM kích thước bằng lệnh DIMALINGED, mình dùng lệnh DIMREASSOCIATE để gắn PLINE với DIM, mình phải ngồi làm từng DIM với từng PLINE, vậy cho mình hỏi có cách nào hay LISP nào mà khi mình quét chọn tất cả nó sẽ hiểu DIM đó là của PLINE đó ko (nghĩa là cái DIM đang đo cho PLINE nào thì sẽ gắn liền với cái PLINE đó)

Thanks các bạn rất nhiều!

Có ai giúp mình với!

Thanks mọi người nhiều lắm!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Còn vấn đề này "các hình chữ nhật có thể bị nổ ra thành line và có thể bị hở nhỏ nữa" thì pótay !

Bạn thử LISP này :

(defun c:addLay (/ ent i j layname objci objpl pt_lst ss ssc)
 ;| By : Gia Bach, gia_bach @  www.CadViet.com             |;  
 (vl-load-com)

(defun GetPtLst (obj / anginc arcparam blg delta eparam inc pt ptlst sparam)
 (setq sparam (vlax-curve-getStartParam obj)
eparam (vlax-curve-getEndParam obj)
anginc (* pi (/ 6 180.0)))
 (while (<= sparam eparam)
   (setq pt (vlax-curve-getPointAtParam obj sparam))
   (if (not (equal pt (car ptlst) 1e-12))
     (setq ptlst (cons pt ptlst)))
   (if (and (/= sparam eparam)
      (setq blg (abs (vlax-invoke obj 'GetBulge sparam)))
      (/= 0 blg))
     (progn
(setq delta (* 4 (atan blg)) ;included angle
      inc (/ 1.0 (1+ (fix (/ delta anginc))))
      arcparam (+ sparam inc))
(while (< arcparam (1+ sparam))
  (setq pt (vlax-curve-getPointAtParam obj arcparam)
	ptlst (cons pt ptlst)
	arcparam (+ inc arcparam))))      )
   (setq sparam (1+ sparam))    )
 ptlst)
;main 
 (princ "\nChon Pline : ")
 (if (setq ss (ssget  '((0 . "LWPOLYLINE"))))
   (progn
     (setq i -1)
     (while (setq ent (ssname ss (setq i (1+ i))))
(setq objPL (vlax-ename->vla-object ent)
      pt_lst (GetPtLst objPL)
      ssC (ssget "_WP" pt_lst (list (cons 0 "CIRCLE"))) )
(if ssC
  (progn
    (setq num (sslength ssC))
    (if (> num 255) (setq num (rem num 255)))
    (setq layname (strcat "Layer_" (itoa num) "_Circle") j -1)
    (or (tblsearch "Layer" layname) (vl-cmdf "-layer" "N" layname "c" num layname ""))
    (vla-put-Layer objPL layname)
    (while (setq ent (ssname ssC (setq j (1+ j))))
      (setq objCi (vlax-ename->vla-object ent) )
      (vla-put-Layer objCi layname) ) ) ))))
 (princ))

Cám ơn bạn, nhưng sao mình thử trên file mình gởi lên cadviet nó lại ko có phản ứng gì hết vậy mong bạn giúp đỡ

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Giúp đỡ e 1 lisp về nội suy điểm. E có một bài toán thế này:

- Pick điểm P1 bất kỳ trong autocad, chỉ nhập thêm cao độ Z1 của điểm đó (user)

- Pick điểm P2 bất kỳ trong autocad, chỉ nhập thêm cao độ Z2 của điểm đó (user)

sau đó chọn điểm bất kỳ nằm trên đường thẳng P1P2, nội suy giá trị Z thông qua các giá trị P1(x1,y1,z1), P2 (x2, y2,z2) và P (x, y) (thuộc đường thẳng P1P2). Ghi giá trị Z nội suy được bằng text. (Các giá trị P này khi pick tùy ý thuộc P1P2)

 

Các bác giúp đỡ e với nhé

Chào bạn Sony2007,

Bài toán của bạn đặt ra chưa chặt chẽ.

Bạn sử dụng việc pick diểm thứ nhất và pick điểm thừ 2 thì Ok chưa có vấn đề gì. Nhưng việc pick điểm thứ 3 thì sao nhỉ??? Có chắc chắn bạn sẽ pick điểm này đúng vào đoạn thẳng P1P2 hay không??? Nếu không trúng (mà điều này có nhẽ chiếm tới xác suất 90% đây bạn ạ) thì sẽ nội suy ra sao bạn nhỉ ?????

Trong trường hợp bạn pick không trúng thì bạn cần có 1 nguyên tắc lựa chọn điêm nào đó nằm trên đoạn thẳng P1P2 để nội suy bạn ạ. Còn việc nội suy này không phải quá phức tạp đâu, chỉ là các phép tính theo tam giác đồng dạng mà thôi. Bạn hoàn toàn có thể làm được mà.

Chúc bạn thành công.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi thấy có vẻ hơi khó (hoặc không thể thực hiện được) vì các đối tượng cùng màu nhưng lại nằm trên các lớp khác nhau, nhưng trên các lớp lại có nhiều đối tượng khác không cùng màu với đối tượng cần bật tắt.

Hiện tại tôi chỉ biết cách bật tắt lớp, còn bật tắt từng đối tượng thì chưa biết. Nếu có thể bật tắt từng đối tượng thì có thể giải quyết được vấn đề của bạn.

Chào bác hoa35ktxd,

Mình thiển nghĩ, có nhẽ có thể thực hiện yêu cầu trên với điều kiện các màu cua các đối tượng trên cad không phải là bylayer.

Khi đó dùng hàm ssget với bộ chọn màu: (ssget "X" (list (cons 62 "giá trị màu tương ứng))) để chọn các đối tượng này.

Sau đó chuyển các đối tượng này về một lớp mới rồi bật tắt lớp này là được.

Các bác thử xem nhé.

Trường hợp có các đối tượng có màu là bylayer trùng với cái màu đã chọn thì phải chuyển các đối tượng được chọn về cùng với layer có màu đó rồi bật tắt nó mới được. Khi đó sẽ phức tạp hơn rất nhiều vì phải xác định tên của layer có màu này. Các bác thử nghiên cứu xem nhé.

Chúc các bác thành công.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Giúp đỡ e 1 lisp về nội suy điểm. E có một bài toán thế này:

- Pick điểm P1 bất kỳ trong autocad, chỉ nhập thêm cao độ Z1 của điểm đó (user)

- Pick điểm P2 bất kỳ trong autocad, chỉ nhập thêm cao độ Z2 của điểm đó (user)

sau đó chọn điểm bất kỳ nằm trên đường thẳng P1P2, nội suy giá trị Z thông qua các giá trị P1(x1,y1,z1), P2 (x2, y2,z2) và P (x, y) (thuộc đường thẳng P1P2). Ghi giá trị Z nội suy được bằng text. (Các giá trị P này khi pick tùy ý thuộc P1P2)

 

Các bác giúp đỡ e với nhé

mình có thằng lisp này,liên hệ với mình

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Thế thì phức tạp và mất thời gian lắm. Mình muốn chỉ dùng lệnh để bật tắt tất cả các đối tượng có cùng màu tương tự như lệnh layiso. Rất mong được các cao thủ giúp đỡ.

 

Đây mình gởi cho bạn nè, đã có bổ sung và chỉnh sửa, bạn dùng thử nhé:

http://www.cadviet.com/upfiles/2/ob01_obj_anhien_theomau.lsp

Chúc bạn vui vẻ!!!

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bạn Sony2007,

Bài toán của bạn đặt ra chưa chặt chẽ.

Bạn sử dụng việc pick diểm thứ nhất và pick điểm thừ 2 thì Ok chưa có vấn đề gì. Nhưng việc pick điểm thứ 3 thì sao nhỉ??? Có chắc chắn bạn sẽ pick điểm này đúng vào đoạn thẳng P1P2 hay không??? Nếu không trúng (mà điều này có nhẽ chiếm tới xác suất 90% đây bạn ạ) thì sẽ nội suy ra sao bạn nhỉ ?????

Trong trường hợp bạn pick không trúng thì bạn cần có 1 nguyên tắc lựa chọn điêm nào đó nằm trên đoạn thẳng P1P2 để nội suy bạn ạ. Còn việc nội suy này không phải quá phức tạp đâu, chỉ là các phép tính theo tam giác đồng dạng mà thôi. Bạn hoàn toàn có thể làm được mà.

Chúc bạn thành công.

Sẽ chắc chắn rằng điểm thứ 3 là P sẽ nằm đúng trên P1P2(xác suất 99.999%). Cơ mà bác PhamThanhBinh đã quên rằng CAD có lệnh UCS; chế độ Ortho và 1 sợi dây tóc chuột hay sao? :cheers:

Nếu P không nằm trên P1P2 thì kiểm tra và hiện lên thông báo

 

@truongthanh : Bạn hãy upload file cụ thể lên xem thế nào? Dạo này Tue_NV bận lắm, chắc là không giúp gì được, nhưng có các bác trên diễn đàn nếu rảnh sẽ giúp bạn mà

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

mình dùng lisp này để phóng điểm lên cad nhưng phóng điểm thì tốt nhưng mà điểm không có ghi tên điểm bro nào có thể giúp mình sau khi phóng điểm lên cad các điểm đó có thể là tên hoặc số thứ tự họăc độ cao không !!!!!!

đây la file lisp minh muon sua http://www.cadviet.com/upfiles/2/importxyz_1.zip

vidu lisp mình đang dùng http://www.cadviet.com/upfiles/2/chua_duoc.dwg

lisp mình muốn http://www.cadviet.com/upfiles/2/sau_khi_sua_lisp.dwg

cám ơn !!!!!!!

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Chào bác hoa35ktxd,

Mình thiển nghĩ, có nhẽ có thể thực hiện yêu cầu trên với điều kiện các màu cua các đối tượng trên cad không phải là bylayer.

Khi đó dùng hàm ssget với bộ chọn màu: (ssget "X" (list (cons 62 "giá trị màu tương ứng))) để chọn các đối tượng này.

Sau đó chuyển các đối tượng này về một lớp mới rồi bật tắt lớp này là được.

Các bác thử xem nhé.

Trường hợp có các đối tượng có màu là bylayer trùng với cái màu đã chọn thì phải chuyển các đối tượng được chọn về cùng với layer có màu đó rồi bật tắt nó mới được. Khi đó sẽ phức tạp hơn rất nhiều vì phải xác định tên của layer có màu này. Các bác thử nghiên cứu xem nhé.

Chúc các bác thành công.

Tôi cũng đã nghĩ đến việc sử dụng lớp trung gian hoặc chuyển các đối tượng về lớp mẫu nhưng như thế sẽ làm cho bản vẽ bị biến đổi, khi muốn quản lý lớp sẽ lại bị rối vì ta không trả các đối tượng về lớp gốc của nó được. (cũng có thể chuyển được với trường hợp bổ sung thêm DXF vì tôi nhớ có ai đó đã nói đến phương pháp này nhưng tôi không rành)

Ngoài ra tôi cũng định làm theo cách gán cho các đối tượng đó có màu trùng với màu nền của CAD tuy nhiên khi trả lại giá trị lại đòi hỏi cái cặp dấu ngoặc bên trên.

Kể ra cũng khoai phết.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi cũng đã nghĩ đến việc sử dụng lớp trung gian hoặc chuyển các đối tượng về lớp mẫu nhưng như thế sẽ làm cho bản vẽ bị biến đổi, khi muốn quản lý lớp sẽ lại bị rối vì ta không trả các đối tượng về lớp gốc của nó được. (cũng có thể chuyển được với trường hợp bổ sung thêm DXF vì tôi nhớ có ai đó đã nói đến phương pháp này nhưng tôi không rành)

Ngoài ra tôi cũng định làm theo cách gán cho các đối tượng đó có màu trùng với màu nền của CAD tuy nhiên khi trả lại giá trị lại đòi hỏi cái cặp dấu ngoặc bên trên.

Kể ra cũng khoai phết.

Mình nghỉ tham khảo lisp ẩn hiện các đối tượng sau sẽ giải quyết được vấn đề.

http://www.cadviet.com/forum/index.php?showtopic=279

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Còn vấn đề này "các hình chữ nhật có thể bị nổ ra thành line và có thể bị hở nhỏ nữa" thì pótay !

Bạn thử LISP này :

(defun c:addLay (/ ent i j layname objci objpl pt_lst ss ssc)
 ;| By : Gia Bach, gia_bach @  www.CadViet.com             |;  
 (vl-load-com)

(defun GetPtLst (obj / anginc arcparam blg delta eparam inc pt ptlst sparam)
 (setq sparam (vlax-curve-getStartParam obj)
eparam (vlax-curve-getEndParam obj)
anginc (* pi (/ 6 180.0)))
 (while (<= sparam eparam)
   (setq pt (vlax-curve-getPointAtParam obj sparam))
   (if (not (equal pt (car ptlst) 1e-12))
     (setq ptlst (cons pt ptlst)))
   (if (and (/= sparam eparam)
      (setq blg (abs (vlax-invoke obj 'GetBulge sparam)))
      (/= 0 blg))
     (progn
(setq delta (* 4 (atan blg)) ;included angle
      inc (/ 1.0 (1+ (fix (/ delta anginc))))
      arcparam (+ sparam inc))
(while (< arcparam (1+ sparam))
  (setq pt (vlax-curve-getPointAtParam obj arcparam)
	ptlst (cons pt ptlst)
	arcparam (+ inc arcparam))))      )
   (setq sparam (1+ sparam))    )
 ptlst)
;main 
 (princ "\nChon Pline : ")
 (if (setq ss (ssget  '((0 . "LWPOLYLINE"))))
   (progn
     (setq i -1)
     (while (setq ent (ssname ss (setq i (1+ i))))
(setq objPL (vlax-ename->vla-object ent)
      pt_lst (GetPtLst objPL)
      ssC (ssget "_WP" pt_lst (list (cons 0 "CIRCLE"))) )
(if ssC
  (progn
    (setq num (sslength ssC))
    (if (> num 255) (setq num (rem num 255)))
    (setq layname (strcat "Layer_" (itoa num) "_Circle") j -1)
    (or (tblsearch "Layer" layname) (vl-cmdf "-layer" "N" layname "c" num layname ""))
    (vla-put-Layer objPL layname)
    (while (setq ent (ssname ssC (setq j (1+ j))))
      (setq objCi (vlax-ename->vla-object ent) )
      (vla-put-Layer objCi layname) ) ) ))))
 (princ))

Đã được rùi rất cám ơn

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tôi cũng đã nghĩ đến việc sử dụng lớp trung gian hoặc chuyển các đối tượng về lớp mẫu nhưng như thế sẽ làm cho bản vẽ bị biến đổi, khi muốn quản lý lớp sẽ lại bị rối vì ta không trả các đối tượng về lớp gốc của nó được. (cũng có thể chuyển được với trường hợp bổ sung thêm DXF vì tôi nhớ có ai đó đã nói đến phương pháp này nhưng tôi không rành)

Ngoài ra tôi cũng định làm theo cách gán cho các đối tượng đó có màu trùng với màu nền của CAD tuy nhiên khi trả lại giá trị lại đòi hỏi cái cặp dấu ngoặc bên trên.

Kể ra cũng khoai phết.

Ủa, LISP này mình đã chỉnh sửa và bổ sung LISP và đã post lên trên rồi, mà sao các bác vẫn còn bàn luận thế, các bác xem thử cái mình gởi rồi cho ý kiến.

 

http://www.cadviet.com/upfiles/2/ob01_obj_anhien_theomau.lsp

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Cho mình hỏi, ví dụ mình có 10 pline đã được DIM kích thước bằng lệnh DIMALINGED, mình dùng lệnh DIMREASSOCIATE để gắn PLINE với DIM, mình phải ngồi làm từng DIM với từng PLINE, vậy cho mình hỏi có cách nào hay LISP nào mà khi mình quét chọn tất cả nó sẽ hiểu DIM đó là của PLINE đó ko (nghĩa là cái DIM đang đo cho PLINE nào thì sẽ gắn liền với cái PLINE đó)

Thanks các bạn rất nhiều!

@truongthanh : Bạn hãy upload file cụ thể lên xem thế nào? Dạo này Tue_NV bận lắm, chắc là không giúp gì được, nhưng có các bác trên diễn đàn nếu rảnh sẽ giúp bạn mà

mình gửi link nhờ các bạn xem xét

http://www.cadviet.com/upfiles/2/dre.dwg

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×