Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
nhoclangbat

[Yêu cầu] lsp tách 1 nhóm layer thành nhiều layer khác nhau

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

nhoclangbat    382

các anh nào giúp em về lsp này với, em có nhiều đối tượng thuộc cùng 1 layer mỗi đối tượng là 1 nhóm, thật em cũng ko pit định nghĩa sao cho đúng nữa em chỉ mới pit ít về cad và lsp thời gian gần đây, em sử dụng cad cũng lâu nhưng chủ yếu là dùng phầm mềm của cơ quan hỗ trợ cho cad có sẵn rùi bắt chước mấy anh trong công ty đi chước chỉ sao làm vậy rùi quen tay chứ chứa thật sự hiểu rõ về cad lắm. Ý em là trên tờ bản đồ có nhiều thửa, mỗi thửa có thể hiện loại đất, số thửa, diện tích thửa đó, trong đó loại đất đc ký hiệu bằng file text, số thửa là số nguyên, diện tích là số thực, số thửa nằm ở trên diện tích nằm ở dưới, ngăn nhau bởi 1 line, ký hiệu loại đất nằm bên trái ở giữa line, tất cả đều là cùng 1 layer, giờ em mún tách các đối tượng đó ra thành từng layer riêng biệt giống như file vd bên dưới, và mình chỉ cần làm cho 1 thửa thì các thửa khác cũng tự động biến đổi theo. Em hiểu sao thì em trình bày vậy có gì sai mong các anh thông cảm. Anh nào có thể giúp em, em xin cám ơn rất nhiều.

PS: xin lỗi vì sự sơ sót của em trong bài post cũ

http://www.cadviet.c...04473_mau_3.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
ketxu    2.653

nhoclangbat sửa lại bài viết đi. Phần nội dung yêu cầu trình bay bằng lời, kèm theo file + hình ảnh nếu có. Tên tiêu đề sai trầm trọng về định nghĩa nhóm layer. Phần mình fw thì chuyển vào thẻ quote làm gợi ý để bạn mày mò hoặc ai đó viết giúp, k phải lấy thay lời yêu cầu

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
thanhduan2407    227

- Quét chọn toàn bộ các text thuộc layer 13 (ss)

- Phân nhỏ tập chọn ss thành 2 phần : toàn số (sso) và toàn chữ (schu)

- Duyệt qua từng text (x) toàn chữ (text ruộng đất) và chuyển thành layer Ruộng đất

+ Tìm trong tập text toàn số 2 text (m và n) gần text chữ (x) nhất.

+ Sắp xếp 2 text theo thứ tự từ trên xuống, chuyển chữ bên trên thành layer số thửa, chữ bên dưới thành layer diện tích

+ Xóa 2 text số khỏi tập số (sso)

 

Chú ý là việc tìm kiếm theo khoảng cách có thể có sai lầm, phải kiểm tra lại số thửa là số nguyên (hoặc 1 vài đặc thù khác mà e cần tự chỉ ra cho lispers quy luật nhận biết) :)

 

- Trong trường hợp tên thửa ruộng chắc chắn là chữ, số thửa luôn là số nguyên, diện tích luôn là số thực (có ít nhất 1 số lẻ sau dấu ,) thì bài toán giải quyết rất dễ dàng, chuyển toàn bộ chữ thành layer thửa, toàn bộ số nguyên thành layer số thửa và toàn bộ STP thành layer diện tích.

file vd:

http://www.cadviet.c...04473_mau_3.dwg

Yêu cầu nhưng cũng chẳng có lời hay ý đẹp. Cũng ko kèm theo lời cảm ơn. Cứ như kiểu đưa lên đó thì khắc có người làm giúp. Nhạt

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
Doan Van Ha    2.678

Hỏi: trên bản vẽ của bạn còn có đối tượng nào thuộc layer "13" nữa hay không, hay chỉ gồm có 4 loại đó là thuộc layer "13" thôi?

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
aliosa    4

Cũng thông cảm thôi! Thực ra mới bắt tay vào làm Cad thì vất lắm. Không trình bày rành mạch được. Bạn "nhoclangbat" đã viết một đoạn dài thế để trình bày là thiệt tình rồi. Còn cách trình bày có trong và sáng không thì cái này cần nhiều thời gian lắm. Mọi người ra tay giúp bạn đó đi. Thấy bạn Ketxu dạo này làm công việc quản lý nhiều hơn rùi. Viết lách cũng ít đi không thấy giống Lemac 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
ketxu    2.653

Cũng thông cảm thôi! Thực ra mới bắt tay vào làm Cad thì vất lắm. Không trình bày rành mạch được. Bạn "nhoclangbat" đã viết một đoạn dài thế để trình bày là thiệt tình rồi. Còn cách trình bày có trong và sáng không thì cái này cần nhiều thời gian lắm. Mọi người ra tay giúp bạn đó đi. Thấy bạn Ketxu dạo này làm công việc quản lý nhiều hơn rùi. Viết lách cũng ít đi không thấy giống Lemac lắm !

:) Cái đoạn dài dài đó là ketxu nói đó bạn ạ ^^

Mình thì quá bận nên k tham gia viết nhiều được, chứ về mọi mặt từ trước đến giờ chưa có lúc nào có cửa so với LM được :)

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
hochoaivandot    108

Bạn có thể upload file cad gốc không?

Bạn đo giải thửa đúng không?

Mình nghĩ nếu file cad ghi kết quả đo giải thửa của bạn đang có là sản phầm của 1 tiện ích nào đó, thì rất có khả năng nó là 1 block thuộc tính.

Cho nên bạn thử upload file cad đó lên để mọi người cũng nghiên cứu.

Và nếu may mắn hơn, mình đoán đúng. Đối tượng đó là block thuộc tính thì viết lisp rất đơn giản.

Lúc đó, cadviet sẽ viết 1 lisp tổng quát hơn:

+ Explode attribute to text.

+ Gán layer của các text được explode ra theo layer (tên layer là Tag của attribute)

Chào 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
ketxu    2.653

Gán layer trước rồi burst sau chứ HHVD ^^ Đập chết nó trong rọ rồi thả ra, chứ để nó xổng ra rồi chạy theo mệt lắm ^^

 

@nhoclangbat : bài toán dễ, nên post toàn bộ file lên để lispers nắm rõ quy luật. Nếu đúng như những dòng mình đoán thì lisp k quá 10 dò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
Tue_NV    3.841

da chỉ có 4 đối tượng đó thuộc layer 13 thui anh

Bạn giải quyết bằng CAD cũng được, cũng nhanh

Này nhé:

Dùng Layiso -> Hiện layer 13 lên

Chọn hết đối tượng thuộc Layer13

- Dùng lệnh Find :

chọn đối tượng có "@" (chính tên T) chuyển sang Layer ruộng đât ->

chọn đối tượng có "#" (chính tên 128.1) chuyển sang Layer diện tích ->

chọn đối tượng có "~@" (chính tên 112) chuyển sang Layer số thửa ->

Cái Line còn lại thuộc Layer 13 -> thôi không chuyển nữa là xong

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
aliosa    4

Nói thế thôi ! Cảm ơn các bạn Catviet và Ketxu nhiều lắm. Các bạn đã rất nhiệt tình rồi. Còn phải dành thời gian cho gia đình và chuyện cơm áo gạo tiền nữa. Quả thật nhiều khi đọc các câu hỏi yêu cầu trong diễn đàn mình cũng không hiểu yêu cầu nữa, nhưng các bạn trong diễn đàn vẫn nhiệt tình trao đổi. Cái này như đã nói nên thông cảm thôi (giống mình ngày xưa ý mà).

Qua Cadviet mình cũng lên tay nhiều. Xuất thân chỉ học Pascan ở đại học được 1 tháng nhờ có diễn đàn mà nay đã tự viết được một số lisp đơn giản. Còn khoản copy lisp và chỉnh sửa lại chút chút để dùng thì khá hơn.

Xin chúc các thành viên Cadviet mạnh khỏe và 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
nhoclangbat    382

anh tue_vn em chưa hiểu lắm cách tìm lệnh fine thì em pit nhưng "@" rùi "#" , "~@" ko pit là sao hết hii, sẵn đây em sẽ đưa file góc để mấy anh nghiên cứu rõ hơn, thật ra lúc đầu mấy cụm thuộc layer13 đó là 1 block bình thường thui ko phải block thuộc tính, trước tiên phải phá hết block rùi mới đổi layer , hồi đó ở công ty có lsp đó mà máy em man man cài lại win, mất hết, mấy anh trong công ty giờ thì ko dùng lsp đó nữa nên cũng ko có, mà em wen xài vậy nên mới nhờ mấy anh thử nghiên cứu hộ em hihi

http://www.cadviet.com/upfiles/3/104473_mau_4.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
Tue_NV    3.841

"#" thì gồm cả 128.1 và 112 mà?

Tue_NV thử với lệnh find chỉ có 128.1 thôi bác ạ.

Bác đã thử chưa?

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
Tue_NV    3.841

Theo wcmatch thì phải thế, và thử rồi cũng vẫn thế: nó lượm cả 2 thằng!

À quên, bác phải vô option -> chọn Find whole words only mới được

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
ketxu    2.653

Ví dụ nếu toàn text thì quét chọn :

(defun c:test(/ ss a )(vl-load-com)
   (setq 	a    '((INT . "SOTHUA")(REAL . "DIENTICH")(STR . "LOAIRUONGDAT"))
  	     tmp 	(ssget (list (cons 0 "TEXT")(cons 8 "13")))
   )    
   (vlax-for x (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))        
       (if (setq tmp (assoc (type (read (vla-get-textstring x))) a))
  	     (vla-put-layer x (cdr tmp))
       )
   )        
)

Lưu ý nhoclangbat, nếu là các text rời rạc thì chẳng có cớ j để chỉnh 1 thằng những thằng khác chạy theo cả :)

 

 

P/s : vừa ngồi máy down đc file CAD về xem, thấy toàn là block anon, thật k hiểu sao người viết ct lại quản lý bằng cách đó :) => nhoclangbat : explode ra nhé

 

@aliosa : pascal thì mình cũng có nghe qua, pascan thì chưa ^^

  • 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
nhoclangbat    382

em cũng ko pit nửa anh ketxu ơi tờ bản đồ đó góc là làm bên microstation sau đó export qua cad là nó dậy lun đó, ah còn về lsp anh ketxu viết gần đúng ý em hihi, chắc tại em chưa nói rõ là nó tự tao layer sothua và dientich lun , cái chữa T khỏi cũng đc, lsp anh viết nó chỉ đổi khi trong layer của file cad đã có sẵn 2 layer đó rùi nó đổi hihi

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
ketxu    2.653

Tự tạo thì e search từ tạo layer trên diễn đàn, nhiều vô kể, tìm và paste vào đầu lisp. A viết cũng chỉ thêm 2 dòng nữa, nhưng đó là kết quả yêu cầu thiếu thốn của em.

Ngoài ra phần lý thuyết lớp lisp đã có, chương 8, level 3, áp dụng command và lệnh -layer, e có thể xem và tự làm

 

P/s : à phần LOAIRUONGDAT e chuyển STR thành SYM 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
hochoaivandot    108

Fix để nhận luôn layer LOAIRUONGDAT

(defun c:test(/ ss a )(vl-load-com)
(setq  a	'((INT . "SOTHUA")(REAL . "DIENTICH")(SYM . "LOAIRUONGDAT"))
		tmp  (ssget (list (cons 0 "TEXT")(cons 8 "13")))
)  
(vlax-for x (vla-get-ActiveSelectionSet (vla-get-ActiveDocument (vlax-get-acad-object)))      
   	(if (setq tmp (assoc (type (read (vla-get-textstring x))) a))
		(vla-put-layer x (cdr tmp))
   	)
)      
)

  • 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
aliosa    4

Tuyệt vời! Đã có kết quả rồi.

Nhưng nhìn bản vẽ đoán là chủ topic muốn thống kê đất theo bảng. Nếu như đúng vậy có lẽ đua bản vẽ từ đầu và nhờ giúp luôn thì chắc nhanh hơn nhiều.

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
hochoaivandot    108
Nếu HHVD chỉ cần viết "STR" >> "SYM" thì vừa đỡ tốn đất vừa tránh hiểu nhầm.

 

1. Lisp mình upload ở trên là của ketxu. Nhưng ketxu thiếu xót chổ STR và SYM nên mình fix giúp. Và upload cho vào thẻ code để ai không biết lisp hoặc ai đó search thấy lisp mà không theo dõi hết topic cung có thể dùng. Mọi người Like cho ketxu ấy.

2. Mình viết lại lisp, Mình viét theo ý mình. Đối tượng chọn ở đây là block chứ không cần explode chọn text như ketxu.

Hi vọng trúng ý chủ topic.

(defun dxf (code e) (cdr (assoc code (entget e))))
(defun PUT-GC (VALUE GROUP ENTITY / PROPERTIES)
(setq PROPERTIES (entget ENTITY))
(setq PROPERTIES (subst (cons GROUP VALUE) (assoc GROUP PROPERTIES) PROPERTIES))
(entmod PROPERTIES)
)
(defun CreatLayer(MyLayer / MyColor)
(if (not (tblsearch "LAYER" MyLayer))
(progn
 (entmakex
  (list
(cons 0 "LAYER")
(cons 100 "AcDbSymbolTableRecord")
(cons 100 "AcDbLayerTableRecord")
(cons 70 0)
(cons 2 MyLayer)  
  )
 )
)
)
)
(defun c:test2 (/ ss a el qa kq i dt type_dt)
(vl-load-com)
(CreatLayer "SOTHUA")
(CreatLayer "DIENTICH")
(CreatLayer "LOAIRUONGDAT")
(setq ss  (ssget (list (cons 0 "INSERT") (cons 8 "13"))))
(setq el (entlast) kq (ssadd))
(setq qa (getvar 'QAFLAGS))
(setvar 'QAFLAGS 1)
(command "explode" ss "")
(setvar 'QAFLAGS qa)
(while (setq en (entnext el))
   	(if (= (dxf 0 en) "TEXT") (ssadd en kq))
   	(setq el en)
)
(repeat (setq i (sslength kq))
 (setq dt (ssname kq (setq i (1- i))))
 (setq type_dt (type (read (dxf 1 dt))))
 (cond
  ((= type_dt 'INT) (PUT-GC "SOTHUA" 8 dt))
  ((= type_dt 'REAL) (PUT-GC "DIENTICH" 8 dt))
  ((= type_dt 'SYM) (PUT-GC "LOAIRUONGDAT" 8 dt))
 )
)
(princ "\nHochoaivandot - Cadviet.com")
)

 

Ketxu viết đã đáp ứng yêu cầu của chủ topic, nhưng tại thấy ấy nấy mọi người Like nhầm cho mình nên mình viết lại. Hìhì! Hi vọng giúp thêm được bạn ấy mà không thừa.

  • Vote tăng 2

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ạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay


×