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.
Nguyen Hoanh

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

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

phamngoctukts    708
phamngoctukts thử lấy tọa độ của đường bao rồi gọi hàm ssget với tùy chọn "cp"

(setq lstt (acet-geom-vertex-list plk))

(setq sst (ssget "cp" lstt '((0 . "TEXT"))))

Em thử làm thế rồi mà Bác ạ. vấn đề là thế này.

tạo một tập hợp các buondary quang thửa được chọn

lấy list các điểm của boundary này rồi dùng ssget để chọn text

nhưng làm cách nào để lấy các boundary nàu cho đúng vì có những miền quanh thửa được lựa chọn bị hở. đường bo tạo nên thửa không không được break tại điểm giao.

Em đã thử như thế này:

offset dường bounday ra một khoảng -> lấy list điểm giữa của các cạnh của boundart vừa tạo -> tạo boundary với pickpoint là các điểm giữa này -> láy list point của buondary vừa tạo -> dùng ssget để lấy text.

Nhưng lisp chạy không đú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
gia_bach    1.442
Em thử làm thế rồi mà Bác ạ. vấn đề là thế này.

tạo một tập hợp các buondary quang thửa được chọn

lấy list các điểm của boundary này rồi dùng ssget để chọn text

nhưng làm cách nào để lấy các boundary nàu cho đúng vì có những miền quanh thửa được lựa chọn bị hở. đường bo tạo nên thửa không không được break tại điểm giao.

Em đã thử như thế này:

offset dường bounday ra một khoảng -> lấy list điểm giữa của các cạnh của boundart vừa tạo -> tạo boundary với pickpoint là các điểm giữa này -> láy list point của buondary vừa tạo -> dùng ssget để lấy text.

Nhưng lisp chạy không đúng.

Ý tưởng vẫn là dựa trên LISP của bạn, tôi chỉ góp ý về hàm lọc Text

(defun laytext ( plk / stt)
 (setq lstt (acet-geom-vertex-list plk))
 (setq sst (ssget "cp" lstt '((0 . "TEXT"))))
 [b](lọc_Text_ngoài_đường_bao)[/b]
 sst  ) 

 

+ hàm (lọc_Text_ngoài_đường_bao):

lần lượt duyệt qua các Text trong tập chọn sst

- nếu điểm chèn của Text nằm ngoài đường bao : xóa Text đó ra khỏi tập chọn.

  • 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
phamngoctukts    708
- nếu điểm chèn của Text nằm ngoài đường bao : xóa Text đó ra khỏi tập chọn.

Cám ơn bác nhưng vấn đề của em là xác định cái đường bao đó.

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
phamthanhbinh    3.123
Tạo bình thường mà bạn. Trước khi tạo bạn phải xoá bỏ cái rectang bao ngoài và cái hình sản phẩm đi không thì lisp chay sai.

Chào bác Phamngoctukts,

Mình có chạy thử cái lisp này cho một vài trường hợp thì thấy có một vài thắc mắc như sau:

1/- Khi tạo region để lấy diện tích của một polylỉne kín, nếu polyline này tạo thành đa giác lõm thì cái diện tích lấy được không hoàn toàn đúng.

2/- Có trường hợp sau khi chạy lisp vẫn tồn tại một khung bao ngoài của đường bao cần tạo. Điều này theo mình nghĩ có thể là do khi tạo region mới phát sinh đường bao này, vì trong lisp dẵ xóa đường bao el1 rồi.

3/- Vì sao khi các polyline kín đã được block lại vẫn bị lấy vào trong tập chọn ss bởi hàm (ssget "w" p1 p2 (list (cons 0 "lwpolyline"))) ????

Rất mong bác xem xét lại và giải đáp giùm. Cám ơn bác trướ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
phamngoctukts    708
Chào bác Phamngoctukts,

Mình có chạy thử cái lisp này cho một vài trường hợp thì thấy có một vài thắc mắc như sau:

1/- Khi tạo region để lấy diện tích của một polylỉne kín, nếu polyline này tạo thành đa giác lõm thì cái diện tích lấy được không hoàn toàn đúng.

2/- Có trường hợp sau khi chạy lisp vẫn tồn tại một khung bao ngoài của đường bao cần tạo. Điều này theo mình nghĩ có thể là do khi tạo region mới phát sinh đường bao này, vì trong lisp dẵ xóa đường bao el1 rồi.

3/- Vì sao khi các polyline kín đã được block lại vẫn bị lấy vào trong tập chọn ss bởi hàm (ssget "w" p1 p2 (list (cons 0 "lwpolyline"))) ????

Rất mong bác xem xét lại và giải đáp giùm. Cám ơn bác trước.

Chào Bác Bình!

1. Diện tích không hoàn toàn đúng là thế nào hả Bác (tức là nó bị sai số hay là sai hoàn toàn).

2. Theo em nghĩ tồn tại đường bao là do hàm (ssget "w" p1 p2 (list (cons 0 "lwpolyline"))) điểm p1 p2 không thấy trên màn hình. Bác thử bổ xung thêm (command "zoom" "w" p1 p2) xem sao.

3. Bác xem lại xem các polylỉne có được cho vào block đâu. Block chỉ tạo ra lúc ban đầu với mục đích là lấy cái rectang bao ngoài của những đối tượng được chọn. đến khi kết thúc lisp mới explode này ra 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
gia_bach    1.442
Cám ơn bác nhưng vấn đề của em là xác định cái đường bao đó.

Sorry phamngoctukts.

Đọc lại yêu cầu của lacvanhoa là trích thông tin của các thửa giáp ranh thì rất khó.

Vì diện tich thửa thay đổi không theo qui luật nào cả, có lẻ chỉ còn cách chọn từng Text thôi.

 

Hoặc tìm (tạo ra) tất cả các đuờng bao của các thửa giáp ranh-> lọc ra tên chủ thửa đấ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
VUVUZELA    98

Theo tôi thì giải bài toán này cũng tương đối dễ thôi là như thế này :

1. Người dùng chọn điểm để tạo Boundary lô đất cần làm sổ thửa đất ==> tạo polyline A kín của thửa đất

2. Lấy list điểm dt A vừa tạo (ví dụ như n điểm)

3. Dùng hàm xác định vùng bắt điểm theo từng cạnh của lô đất. Ví dụ như lô đất có 6 điểm thì sẽ có (6-1)=5 vùng kín để chọn TEXT khoang vùng để chọn tên của người hàng xóm cùng lô đất

4. Lọc TEXT trong vùng chọn trên cơ sở chỉ chọn 1 TEXT có vị trí gần nhất cạnh chọn của lô đất ==> sẽ được TEXT tên hàng xóm

....

Bài toán ra như ý

Không biết là ý kiến các bác thế nào

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
phamthanhbinh    3.123
Chào Bác Bình!

1. Diện tích không hoàn toàn đúng là thế nào hả Bác (tức là nó bị sai số hay là sai hoàn toàn).

2. Theo em nghĩ tồn tại đường bao là do hàm (ssget "w" p1 p2 (list (cons 0 "lwpolyline"))) điểm p1 p2 không thấy trên màn hình. Bác thử bổ xung thêm (command "zoom" "w" p1 p2) xem sao.

3. Bác xem lại xem các polylỉne có được cho vào block đâu. Block chỉ tạo ra lúc ban đầu với mục đích là lấy cái rectang bao ngoài của những đối tượng được chọn. đến khi kết thúc lisp mới explode này ra mà.

1/- Diện tich không hoàn toàn đúng tức là nó có lấy được diện tích nhưng hình như không phải của đa giác lõm mà là cái diện tích của một hình bao nào đó chứa cái đa giác lõm đó bác ạ. Bởi vì khi mình kiểm tra lại cái list tập chọn lar thì mình thấy cái ename thì đúng là của đa giác lõm nhưng diện tích thì lại lớn hơn khá nhiều lần bác à.

2/- Không phải là do 2 diểm p1 p2 không thấy trên màn hình mà kể cả khi thấy. Mình thậm chí còn tạo thêm các điểm này để kiểm tra mà, Lý do thì mình chưa rõ lắm nên mới hỏi lại bác bác à.

3/- Sau khi tạo block thì tất cả các đối tượng trong vùng chọn ban đầu (tức là tập chọn ss) sẽ ẩn đi hết. Lúc này mới insert cái block b_temp vô và trên bản vẽ, vùng chọn lúc này chỉ có duy nhất cái block b_temp mà thôi. Phải không ạ???

Tiếp đó bác tạo thêm cái rectangle el1 để lấy boundary rồi xóa cái el1 này đi.

Như vậy trên bản vẽ về lý thuyết thì chỉ còn hai cái polyline được tạo ra bởi lệnh boundary mà thôi chứ bác. Một cái là của hình chữ nhật bao ngoài tạo ra, và một cái bao lấy biên dạng của block nằm bên trong hình chữ nhật bao đó.

Chính vì vậy mà bác mới giữ lại cái polyline có diện tích lớn thứ hai mà bác.

Vậy mà khi lấy (setq ss (ssget "w" p1 p2 (list (cons 0 "lwpolyline")))) thì lại xuất hiện các polyline nằm bên trong cái đường bao block nữa bác ạ. Mình đã thử bổ sung thêm thằng dxf 70 để chỉ chọn các polyline kín nó cũng vẫn chui vào. Mình đang nghĩ rằng hay là tại sau khi tạo block thì các đối tượng chỉ bị ẩn đi chứ không bị xóa hẳn. Do đó khi lấy tập chọn ss lần hai này nó lại lổm ngổm chui vào nằm ăn vạ hả bác. Nếu vậy có thể chơi một thằng (command "erase" ss "") sau khi tạo được block b_temp có được không bác hỉ???

Nếu được vậy có nhẽ sẽ tránh được các lỗi do mấy thằng polyline kím lõm có trong block gây ra như mình đã nói ở trên.

Mong bác quan tâm giải đáp giùm nhé.....

Thanks.

 

Để bác dễ hình dung, mình gửi bác cái kết quả kiểm tra quá trình chạy lisp của mình:

Đây là hình ảnh kết quả sau bước sắp xếp lại list lar bởi hàm (vl-sort.....)

gi7843ithich.jpg

Các hình có màu vàng là mình đã di chuyển ra khỏi vùng chọn cho dễ nhìn.

Dưới đây là các ename của đối tượng màu vàng lấy từ ngoài vào trong (từ diện tích lớn nhất đến nhỏ nhất.)

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Và đây là cái list lar được lấy ra sau khi đã sắp xếp để kiểm tra.

 

Command: !lar

((446497.0 ) (446497.0 )

(238269.0 ) (167058.0 ) (61075.0

))

 

Bác chú ý đối tượng có Entity name là là đối tượng đa giác lõm có diện tích nhỏ nhất trong các polyline kín. Vậy nhưng trong list lar thì nó lại đứng thứ 2 và có diện tích bằng với cái khung chữ nhật bao có diện tích lớn nhất là 446997.0 ???

Cũng vì vậy trong trường hợp này kết quả sẽ không có cái đường bao có entyti name là do nó đã bị xóa ở các bước tiếp theo bác ạ.

 

Tuy nhiên nếu bác insert một block b_temp khác rồi explode nó ra và chạy lisp thì nó lại cho kết quả khá ngon lành với cái list lar chỉ còn đúng hai đối tượng như mình đã nói phía trên.

Và đó là điều mình chưa hiểu nên mới mày mò tìm hiểu như trên.

 

Một phát hiện nữa của mình trong quá trình mày mò là khi bác dùng hàm (vla-get-area ob) thì diện tích lấy ra được làm tròn đến hàng đơn vị, còn nếu dùng (command "area" "o" .....) thì diện tích cho ra số lẻ tới 4 chữ số thập phân. Việc này tuy không quá quan trọng nhưng nếu bác giải thích được để mình nắm rõ hơn về các hàm này thì rất cám ơn bác.

Khi dùng hàm (command "area" "o" ...) thì mình có diện tích của đối tượng đa giác lõm là Area = 11477.3954 bác ạ. Theo mình nghĩ có nhẽ cái diện tích này mới là đúng của đa giác lõm.

 

Một điểm nữa có nhẽ bác nhầm trong lisp là việc lấy cái điểm p. Bác đặt (setq p (polar p1 (/ pi 4) 25)) theo mình phải là (setq p (polar p2 (/ pi 4) 25)) mới chuẩn bác ạ vì nếu lấy mốc p1 thì có thể p sẽ chui vào bên trong cái block của bác mất.

 

Hề hề hề, vì mình đang đi mót nên nếu có chỗ nào ngô nghê mong bác đừng cười và cố gắng giải thích giùm mình nhé.

Cám ơn bác 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
phamthanhbinh    3.123
Theo tôi thì giải bài toán này cũng tương đối dễ thôi là như thế này :

1. Người dùng chọn điểm để tạo Boundary lô đất cần làm sổ thửa đất ==> tạo polyline A kín của thửa đất

2. Lấy list điểm dt A vừa tạo (ví dụ như n điểm)

3. Dùng hàm xác định vùng bắt điểm theo từng cạnh của lô đất. Ví dụ như lô đất có 6 điểm thì sẽ có (6-1)=5 vùng kín để chọn TEXT khoang vùng để chọn tên của người hàng xóm cùng lô đất

4. Lọc TEXT trong vùng chọn trên cơ sở chỉ chọn 1 TEXT có vị trí gần nhất cạnh chọn của lô đất ==> sẽ được TEXT tên hàng xóm

....

Bài toán ra như ý

Không biết là ý kiến các bác thế nào

Hề hề hề,

Ý tưởng của bác có nhẽ phải được thông báo với các nhà quy hoạch để họ biết mà làm cho đúng thì mới được bác ạ vì:

1/- Trong vùng chọn sẽ có nhiều text với các nội dung khác nhau, Vớ được anh gần cạnh nhất thì anh ấy lại chẳng phải tên chủ đất mà là cái diện tích thửa thì bác phải trình quốc hội để đổi tên ông hàng xóm hử bác???

2/-Có thể sẽ sót mấy ông hàng xóm nếu như thửa đất của ông ta chỉ giáp đỉnh với thửa bác đang xét bác ạ. Khi ấy có nhẽ lại kiện nhau to mất.

Thế nên mấy qnh quy hoạch phải:

1/- Quy hoạch sao để tại mỗi điểm góc ranh chỉ có không quá 3 thửa đất chung nhau???? hề hề hề, khó

2/- Quy hoạch xong thì phải đặt tên các ông chủ đất nằm sát với các cạnh thửa của ổng, nghĩa là mỗi thửa có bao nhiêu cạnh thì ổng phải phân thân ra làm bấy nhiêu mảnh để mà nằm cho bác dễ xoa đầu hỉ????

 

Hề hề hề, có chi thất thố mong bác chớ giận nha.....

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
linhoreka    47

Hic, topic chi mà dài 140 trang lận, vào chả biết đầu bài ở đâu ?

Đề nghị chia nhỏ ra theo đầu bài anh em mới đến mới hiểu các bác cãi nhau cái chi chứ !

  • 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
18011985    61

Mình có 1 lsp yêu cầu như sau:

- Chọn 1 tổ hợp các text (số thực)

- Các text có toạ độ trùng nhau thì được cộng giá trị với nhau và ghi lại thành 1 text cùng vị trí và duy nhất.(xoá điểm trùng ghi 1 text mới ở vị trí cũ)

- Các text không trùng toạ độ thì bỏ qua.

Rất mong nhận được sự giúp đỡ của các 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
phamthanhbinh    3.123
Hic, topic chi mà dài 140 trang lận, vào chả biết đầu bài ở đâu ?

Đề nghị chia nhỏ ra theo đầu bài anh em mới đến mới hiểu các bác cãi nhau cái chi chứ !

Hề hề hề,

Vì đây là topic viết theo yêu cầu, mà cái yêu cầu của thành viên thì nó vô thiên lủng, vậy nên nó mới dài vầy. Nếu các thành viên chịu khó lập thành topic riêng thì hay quá. BQT do tôn trọng các thành viên nên cứ để nguyên yêu cầu của họ như vầy. Nếu bác có lòng muốn tìm hiểu, hãy chịu khó theo dõi topic thường xuyên sẽ hiểu mọi người đang thắc mắc cái chi mà.

Là người am hiểu mong bác hãy giúp đỡ mọi người nếu có thể và đừng quá câu nệ những tiểu tiết chưa hoàn thiện này.

Hề hề hề,

Chúc bác vui khi chơi cùng anh em trên diễn đà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
phamthanhbinh    3.123
Mình có 1 lsp yêu cầu như sau:

- Chọn 1 tổ hợp các text (số thực)

- Các text có toạ độ trùng nhau thì được cộng giá trị với nhau và ghi lại thành 1 text cùng vị trí và duy nhất.(xoá điểm trùng ghi 1 text mới ở vị trí cũ)

- Các text không trùng toạ độ thì bỏ qua.

Rất mong nhận được sự giúp đỡ của các bạn.

Chào bạn 18011985,

Yêu cầu của bạn không quá khó nhưng có nhẽ bạn nên nói rõ hơn một chút :

1/- Trùng tọa độ ở đây được hiểu thế nào??? Là trùng điểm đặt của text hay là trùng điểm mà text định biểu diễn (hình như trong nghề các bạn gọi là điểm mia miếc gì đó thì phải).

2/- Cộng giá trị tức là cộng giá trị số hay chỉ là cộng giá trị nội dung text (tỷ như text tổng bằng (strcat text1 text2 .... textn).

 

Tốt nhất bạn nên post một bản vẽ mẫu cái bạn đã có và cái kết quả bạn cần sẽ đỡ hiểu nhầm hơn và đỡ mất công làm đi làm lại bạn ạ...

Chúc bạn vui.

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
18011985    61
Chào bạn 18011985,

Yêu cầu của bạn không quá khó nhưng có nhẽ bạn nên nói rõ hơn một chút :

1/- Trùng tọa độ ở đây được hiểu thế nào??? Là trùng điểm đặt của text hay là trùng điểm mà text định biểu diễn (hình như trong nghề các bạn gọi là điểm mia miếc gì đó thì phải).

2/- Cộng giá trị tức là cộng giá trị số hay chỉ là cộng giá trị nội dung text (tỷ như text tổng bằng (strcat text1 text2 .... textn).

 

Tốt nhất bạn nên post một bản vẽ mẫu cái bạn đã có và cái kết quả bạn cần sẽ đỡ hiểu nhầm hơn và đỡ mất công làm đi làm lại bạn ạ...

Chúc bạn vui.

1_29.jpg

Kết quả trước và sau khi dùng lsp

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
phamngoctukts    708
1/- Diện tich không hoàn toàn đúng tức là nó có lấy được diện tích nhưng hình như không phải của đa giác lõm mà là cái diện tích của một hình bao nào đó chứa cái đa giác lõm đó bác ạ. Bởi vì khi mình kiểm tra lại cái list tập chọn lar thì mình thấy cái ename thì đúng là của đa giác lõm nhưng diện tích thì lại lớn hơn khá nhiều lần bác à.

2/- Không phải là do 2 diểm p1 p2 không thấy trên màn hình mà kể cả khi thấy. Mình thậm chí còn tạo thêm các điểm này để kiểm tra mà, Lý do thì mình chưa rõ lắm nên mới hỏi lại bác bác à.

3/- Sau khi tạo block thì tất cả các đối tượng trong vùng chọn ban đầu (tức là tập chọn ss) sẽ ẩn đi hết. Lúc này mới insert cái block b_temp vô và trên bản vẽ, vùng chọn lúc này chỉ có duy nhất cái block b_temp mà thôi. Phải không ạ???

Tiếp đó bác tạo thêm cái rectangle el1 để lấy boundary rồi xóa cái el1 này đi.

Như vậy trên bản vẽ về lý thuyết thì chỉ còn hai cái polyline được tạo ra bởi lệnh boundary mà thôi chứ bác. Một cái là của hình chữ nhật bao ngoài tạo ra, và một cái bao lấy biên dạng của block nằm bên trong hình chữ nhật bao đó.

Chính vì vậy mà bác mới giữ lại cái polyline có diện tích lớn thứ hai mà bác.

Vậy mà khi lấy (setq ss (ssget "w" p1 p2 (list (cons 0 "lwpolyline")))) thì lại xuất hiện các polyline nằm bên trong cái đường bao block nữa bác ạ. Mình đã thử bổ sung thêm thằng dxf 70 để chỉ chọn các polyline kín nó cũng vẫn chui vào. Mình đang nghĩ rằng hay là tại sau khi tạo block thì các đối tượng chỉ bị ẩn đi chứ không bị xóa hẳn. Do đó khi lấy tập chọn ss lần hai này nó lại lổm ngổm chui vào nằm ăn vạ hả bác. Nếu vậy có thể chơi một thằng (command "erase" ss "") sau khi tạo được block b_temp có được không bác hỉ???

Nếu được vậy có nhẽ sẽ tránh được các lỗi do mấy thằng polyline kím lõm có trong block gây ra như mình đã nói ở trên.

Mong bác quan tâm giải đáp giùm nhé.....

Thanks.

 

Để bác dễ hình dung, mình gửi bác cái kết quả kiểm tra quá trình chạy lisp của mình:

Đây là hình ảnh kết quả sau bước sắp xếp lại list lar bởi hàm (vl-sort.....)

gi7843ithich.jpg

Các hình có màu vàng là mình đã di chuyển ra khỏi vùng chọn cho dễ nhìn.

Dưới đây là các ename của đối tượng màu vàng lấy từ ngoài vào trong (từ diện tích lớn nhất đến nhỏ nhất.)

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Command: (car(entsel))

 

Select object:

 

Và đây là cái list lar được lấy ra sau khi đã sắp xếp để kiểm tra.

 

Command: !lar

((446497.0 ) (446497.0 )

(238269.0 ) (167058.0 ) (61075.0

))

 

Bác chú ý đối tượng có Entity name là là đối tượng đa giác lõm có diện tích nhỏ nhất trong các polyline kín. Vậy nhưng trong list lar thì nó lại đứng thứ 2 và có diện tích bằng với cái khung chữ nhật bao có diện tích lớn nhất là 446997.0 ???

Cũng vì vậy trong trường hợp này kết quả sẽ không có cái đường bao có entyti name là do nó đã bị xóa ở các bước tiếp theo bác ạ.

 

Tuy nhiên nếu bác insert một block b_temp khác rồi explode nó ra và chạy lisp thì nó lại cho kết quả khá ngon lành với cái list lar chỉ còn đúng hai đối tượng như mình đã nói phía trên.

Và đó là điều mình chưa hiểu nên mới mày mò tìm hiểu như trên.

 

Một phát hiện nữa của mình trong quá trình mày mò là khi bác dùng hàm (vla-get-area ob) thì diện tích lấy ra được làm tròn đến hàng đơn vị, còn nếu dùng (command "area" "o" .....) thì diện tích cho ra số lẻ tới 4 chữ số thập phân. Việc này tuy không quá quan trọng nhưng nếu bác giải thích được để mình nắm rõ hơn về các hàm này thì rất cám ơn bác.

Khi dùng hàm (command "area" "o" ...) thì mình có diện tích của đối tượng đa giác lõm là Area = 11477.3954 bác ạ. Theo mình nghĩ có nhẽ cái diện tích này mới là đúng của đa giác lõm.

 

Một điểm nữa có nhẽ bác nhầm trong lisp là việc lấy cái điểm p. Bác đặt (setq p (polar p1 (/ pi 4) 25)) theo mình phải là (setq p (polar p2 (/ pi 4) 25)) mới chuẩn bác ạ vì nếu lấy mốc p1 thì có thể p sẽ chui vào bên trong cái block của bác mất.

 

Hề hề hề, vì mình đang đi mót nên nếu có chỗ nào ngô nghê mong bác đừng cười và cố gắng giải thích giùm mình nhé.

Cám ơn bác nhiều....

Chào Bác Bình!

1. À ý bác là như vậy.Chính em chạy lisp cũng bị trường hợp như vậy rồi. Ở cái lisp đầu tiên em post cho bạn thì em dùng (setq rm (cadr (caddr lar))) lấy phần tử thứ 3 thì lisp mới chạ đúng trong cá hình của bạn đó up lên. (em cũng chưa hiểu và giải thích được vấn đề này).

2. Theo em thấy như hình của bác up lên thì hình như lisp chạy lỗi và chưa chạy xong thì phải. (block chưa được insert vào thì phải và tập chọn ss chưa được xoá đi)

3. Sau khi tạo block không phải các đối tượng đó bị ẩn đi đâu bac ạ mà nó đã bị xoá hẳn đi rồi. Các pline kín tồn tại là do dùng lệnh Boundary nó sẽ tạo ra các boundary nữa (giống như hatch với tuỳ chọn normal trong mục islands). Em không biết biến hệ thống nào giúp cái boundary này giống như hatch với tuỳ chọn outer thì sẽ không tạo ra các đường boundary không như ý muốn nữa.

Còn dòng (setq p (polar p1 (/ pi 4) 25)) là p1 đấy không phải p2 đâu Bác ạ. Vì ngay từ đầu điểm p1 này đã được setq lại rồi bác đọc lại sẽ rõ. Diểm p1 p2 lúc này không còn là rectang bao ngoài của đối tượng cọn nữa mà nó đã được offset ra một khoảng rồi.

Hề hề về độ ngô nghê thì em giỏi hơn bác nhiều.

  • 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
phamngoctukts    708
1_29.jpg

Kết quả trước và sau khi dùng lsp

Chào bạn 18011985!

Cái này thì đâu có khó. Mình nghĩ với "trình" viết lisp của bạn thì cái này đâu thành vấn đề.

Mà bạn nên up file lên để người viết còn lấy cái mà test.

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
phamthanhbinh    3.123
1_29.jpg

Kết quả trước và sau khi dùng lsp

Chào bạn 18011985,

Bạn dùng thử rồi cho ý kiến nhé.

(defun c:ctxt ( / oldos ss1 ss2 els p1 t1 t2 )
(vl-load-com)
(setq oldos (getvar "osmode")
(setvar "osmode" 0)
(setq ss1 (acet-ss-to-list (ssget "x" (list (cons 0 "text")))))
(foreach x ss1
     (setq els (entget x)
             p1 (cdr (assoc 10 els))
             t1 (atof (cdr (assoc 1 els)))
     )
     (if  (/= t1 0.0)
          (progn
                  (setq ss2 (acet-ss-to-list (ssget "x" (list (cons 0 "text") (cons 10 p1)))))
                  (if (/= ss2 nil)
                      (progn
                               (foreach y ss2
                                    (setq t2 (atof (cdr (assoc 1 (entget y)))))
                                            (if (/= t2 0.0)
                                                (progn
                                                         (setq t1 (+ t1 t2))
                                                         (command "erase" y "")
                                                )
                                             )
                                )                   
                                (setq els (subst (cons 1 (rtos t1 2 0)) (assoc 1 els) els))
                                (entmod els)
                        )
                   )
           )
     )
)
(setvar "osmode" oldos)
)

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
phamngoctukts    708
Theo tôi thì giải bài toán này cũng tương đối dễ thôi là như thế này :

1. Người dùng chọn điểm để tạo Boundary lô đất cần làm sổ thửa đất ==> tạo polyline A kín của thửa đất

2. Lấy list điểm dt A vừa tạo (ví dụ như n điểm)

3. Dùng hàm xác định vùng bắt điểm theo từng cạnh của lô đất. Ví dụ như lô đất có 6 điểm thì sẽ có (6-1)=5 vùng kín để chọn TEXT khoang vùng để chọn tên của người hàng xóm cùng lô đất

4. Lọc TEXT trong vùng chọn trên cơ sở chỉ chọn 1 TEXT có vị trí gần nhất cạnh chọn của lô đất ==> sẽ được TEXT tên hàng xóm

....

Bài toán ra như ý

Không biết là ý kiến các bác thế nào

Chào Bác VUVUZELA!

đúng như Bác Bình nói việc diện tích các thửa đất có diện tích không đều có khi tên của CSD đất lân bang lại xa hơn thử không giáp ranh với nó. Với lại khi vẽ một số đường biên của thửa đất không được ngắt tại điểm giao -> lấy số thủa xung quanh = tổng điểm - 1 bị sai.

Mong các anh em trên diễn đàn có thuật toán gì hay cùng đưa lên tranh luậ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
phamngoctukts    708
Chào bạn 18011985,

Bạn dùng thử rồi cho ý kiến nhé.

(defun c:ctxt ( / oldos ss1 ss2 els p1 t1 t2 )
(vl-load-com)
(setq oldos (getvar "osmode")
(setvar "osmode" 0)
(setq ss1 (acet-ss-to-list (ssget "x" (list (cons 0 "text")))))
(foreach x ss1
     (setq els (entget x)
             p1 (cdr (assoc 10 els))
             t1 (atof (cdr (assoc 1 els)))
     )
     (if  (/= t1 0.0)
          (progn
                  (setq ss2 (acet-ss-to-list (ssget "x" (list (cons 0 "text") (cons 10 p1)))))
                  (if (/= ss2 nil)
                      (progn
                               (foreach y ss2
                                    (setq t2 (atof (cdr (assoc 1 (entget y)))))
                                            (if (/= t2 0.0)
                                                (progn
                                                         (setq t1 (+ t1 t2))
                                                         (command "erase" y "")
                                                )
                                             )
                                )                   
                                (setq els (subst (cons 1 (rtos t1 2 0)) (assoc 1 els) els))
                                (entmod els)
                        )
                   )
           )
     )
)
(setvar "osmode" oldos)
)

Cái này em nghĩ Bác viết theo cái lisp trước mà Bác vừa viết xong đấy. Tức là chọn thằng nào xử luôn thằng đó sẽ giảm time chạy lisp.

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
18011985    61
Chào bạn 18011985,

Bạn dùng thử rồi cho ý kiến nhé.

(defun c:ctxt ( / oldos ss1 ss2 els p1 t1 t2 )
(vl-load-com)
(setq oldos (getvar "osmode")
(setvar "osmode" 0)
(setq ss1 (acet-ss-to-list (ssget "x" (list (cons 0 "text")))))
(foreach x ss1
     (setq els (entget x)
             p1 (cdr (assoc 10 els))
             t1 (atof (cdr (assoc 1 els)))
     )
     (if  (/= t1 0.0)
          (progn
                  (setq ss2 (acet-ss-to-list (ssget "x" (list (cons 0 "text") (cons 10 p1)))))
                  (if (/= ss2 nil)
                      (progn
                               (foreach y ss2
                                    (setq t2 (atof (cdr (assoc 1 (entget y)))))
                                            (if (/= t2 0.0)
                                                (progn
                                                         (setq t1 (+ t1 t2))
                                                         (command "erase" y "")
                                                )
                                             )
                                )                   
                                (setq els (subst (cons 1 (rtos t1 2 0)) (assoc 1 els) els))
                                (entmod els)
                        )
                   )
           )
     )
)
(setvar "osmode" oldos)
)

lsp thiếu 1 dấu ngoặc ở (setq oldos (getvar "osmode")) và chạy lsp báo lỗi

; error: no function definition: ACET-SS-TO-LIST

Check lại hộ mình nhé

@Phamngoctukt trình của mình thì cũng viết được nhưng mình bị lỗi thời gian chạy đang loay hoay. Nên nhờ các bạn thử tìm con đường khác. Vlide của mình sau khi chạy bị báo lỗi 1 nhát giờ đang cài lại CAD hix

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
18011985    61
Bạn bổ xung thêm (vl-load-com).

không thiếu (vl-load-com). Nó không nhận được công thức acet-ss-to-list

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
phamngoctukts    708
không thiếu (vl-load-com). Nó không nhận được công thức acet-ss-to-list

Thế thì bạn cài lại express tool. Trước mình cũng bị lỗi này.

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
18011985    61
Chào bạn 18011985,

Bạn dùng thử rồi cho ý kiến nhé.

(defun c:ctxt ( / oldos ss1 ss2 els p1 t1 t2 )
(vl-load-com)
(setq oldos (getvar "osmode")
(setvar "osmode" 0)
(setq ss1 (acet-ss-to-list (ssget "x" (list (cons 0 "text")))))
(foreach x ss1
     (setq els (entget x)
             p1 (cdr (assoc 10 els))
             t1 (atof (cdr (assoc 1 els)))
     )
     (if  (/= t1 0.0)
          (progn
                  (setq ss2 (acet-ss-to-list (ssget "x" (list (cons 0 "text") (cons 10 p1)))))
                  (if (/= ss2 nil)
                      (progn
                               (foreach y ss2
                                    (setq t2 (atof (cdr (assoc 1 (entget y)))))
                                            (if (/= t2 0.0)
                                                (progn
                                                         (setq t1 (+ t1 t2))
                                                         (command "erase" y "")
                                                )
                                             )
                                )                   
                                (setq els (subst (cons 1 (rtos t1 2 0)) (assoc 1 els) els))
                                (entmod els)
                        )
                   )
           )
     )
)
(setvar "osmode" oldos)
)

Trời chạy được 1 lúc nó xoá sạch text của mình mạc dù chẳng trùng tý tẹo tèo teo nào. Hu hu ngồi undo chít thui.

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.

×