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

Đưa bình đồ dạng đường đồng mức về bình đồ dạng cao độ

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

Chào mọi người, mình có bình đồ dạng số hóa (của cục lưu trữ bản đồ), trong đó chủ yếu là các đường đồng mức, nhưng hay bị đứt khúc (ko còn là dạng pline). Mình có thể định nghĩa lại các đường đồng mức này, chắc phải gán cao độ cho từng đường, tuy nhiên rất mất thời gian, không hiểu còn cách nào nhanh hơn không. Mong mọi người chỉ giúp. Hơn nữa mình cũng muốn sau đó đưa được bình đồ này về dạng các điểm có cao độ, mong mọi người cho phương hướng hoặc cho mình các lisp, phần mềm liên quan. Cám ơn cả nhà.

 

http://www.mediafire.com/?1sp0gselxtwnkxt

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ột vài ý kiến như sau:

- Nếu theo cách làm của bạn, bạn nên download lisp join hàng loạt (đã có trên diễn đàn) để nối các đoạn đường ĐM lại --> giảm đối tượng cần định nghĩa.

- Nếu cần nghiên cứu cách khác --> gặp "nhoclangbat" chuyên biên tập bản đồ sẽ rõ biggrin.png

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 mọi người, mình có bình đồ dạng số hóa (của cục lưu trữ bản đồ), trong đó chủ yếu là các đường đồng mức, nhưng hay bị đứt khúc (ko còn là dạng pline). Mình có thể định nghĩa lại các đường đồng mức này, chắc phải gán cao độ cho từng đường, tuy nhiên rất mất thời gian, không hiểu còn cách nào nhanh hơn không. Mong mọi người chỉ giúp. Hơn nữa mình cũng muốn sau đó đưa được bình đồ này về dạng các điểm có cao độ, mong mọi người cho phương hướng hoặc cho mình các lisp, phần mềm liên quan. Cám ơn cả nhà.

 

http://www.mediafire.com/?1sp0gselxtwnkxt

Hề hề hề,

Mình không phải dân chuyên ngành của bạn. Sau khi đọc yêu cầu của bạn và xem bản vẽ bạn gửi, minh viết cái lisp sau giúp bạn có thể ghi được cao độ của các đường đồng mức dựa vào cách làm như sau:

1/- Mở bản vẽ zoom gần tới một vị trí point chuẩn có ghi sẵn cao độ của điểm đó. Tỷ dụ bạn chọn điểm có cao độ là 392

2/- Vẽ một lwpolyline sao cho nó cắt mỗi đường đồng mức chỉ tại một điểm theo một chiều.gọi là đường dẫn

3/- load lisp

4/- Gõ lệnh cddm và làm theo các yêu cầu của lisp;

  Khi líp yêu cầu chọn đường dẫn thì chọn polyline vừa vẽ

  Khi lisp yêu cầu nhập cao độ bắt đầu thì nhập giá trị chẵn bước của đường đồng mức gần với điểm đã ghi cao độ trước (trong trường hợp cụ thể bản vẽ của bạn gửi thì nhập 380 tường ứng với cao độ điểm là 392)

 Khi líp yêu cầu nhập độ chênh cao giữa các đường đồng mức thì tùy theo chiều vẽ polyline mà nhấp giá trị dương hay âm của độ chênh cao này (trong trường hợp bản vẽ bạn gửi thì giá trị này là + hoặc - 20.

Sau đó nhấn enter và chờ líp hoàn thành công việc của nó.

5/- Check lại xem lisp ghi đúng chưa, nếu thấy chưa đúng thì undo để xóa toàn bộ những gì líp đã làm, không ảnh hưởng tới bản vẽ của bạn.

 

Lưu ý rằng trong bản vẽ bạn gửi, các đường đồng mức nằm trên nhiều layẻ khác nhau mà mình chỉ mới phát hiện được có 3 layẻ là 1,2 và 5. Khi thấy lisp bỏ sót các đường đồng mức chưa được ghi cao độ thì có thể là do đường đồng mức đó nắm khác layẻ với các layẻ kể trên và bạn phải bổ sung layẻ này vào trong bộ chọn đối tượng của lisp.

Hy vọng bạn có thể dùng được lisp này để thuận lợi cho công việc của bạn. Nếu quá trình dùng có vấn đề gì chưa rõ cứ post lên mình sẽ tìm hiểu và giải thích.

Chúc bạn vui

 

 (defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt )(vl-load-com)(setq oldos (getvar "osmode"))(setvar "osmode" 0)(command "undo" "be")(setq pl (car (entsel "\n Chon duong dan"))          plst (acet-geom-vertex-list pl ) ) (setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5"))))) (setq cdmax (getreal "\n Nhap cao do bat dau: ")          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")          i 0 ) (foreach dm ssdml         (setq els (entget dm)                  cdt  (+ cdmax (* i chcd))                  els (subst (cons 38 cdt ) (assoc 38 els) els)                  els (subst (cons 62 2) (assoc 62 els) els) )         (entmod els)         (command "measure" dm   200)         (setq ssp (acet-ss-to-list (ssget "p")))         (foreach pt ssp               (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )         )         (setq i (1+ i)  ))(command "erase" pl "")(command "undo" "e")(setvar "osmode" oldos)(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

để lisp có thể sữ dụng linh động (cho cả bản vẽ của mình) bác Bình có thể sửa lisp để nó nhận tất cả các layer đang hiển thị là đường đồng mức đc ko ! (những layer nào không phải là đường đồng mức thì mình tắt đi trước khi thực hiện lênh của 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

Cái gì cũng khen, riêng phê bình bác PTB một chỗ: hình như lúc nào post bài xong thì bác không chịu đọc lại bài vừa post xem có lỗi chính tả chính hữu gì không để sửa lại cho mọi người nhờ. Bài post hôm nay là 1 ví dụ.

  • 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

 

Hề hề hề,

Mình không phải dân chuyên ngành của bạn. Sau khi đọc yêu cầu của bạn và xem bản vẽ bạn gửi, minh viết cái lisp sau giúp bạn có thể ghi được cao độ của các đường đồng mức dựa vào cách làm như sau:

1/- Mở bản vẽ zoom gần tới một vị trí point chuẩn có ghi sẵn cao độ của điểm đó. Tỷ dụ bạn chọn điểm có cao độ là 392

2/- Vẽ một lwpolyline sao cho nó cắt mỗi đường đồng mức chỉ tại một điểm theo một chiều.gọi là đường dẫn

3/- load lisp

4/- Gõ lệnh cddm và làm theo các yêu cầu của lisp;

  Khi líp yêu cầu chọn đường dẫn thì chọn polyline vừa vẽ

  Khi lisp yêu cầu nhập cao độ bắt đầu thì nhập giá trị chẵn bước của đường đồng mức gần với điểm đã ghi cao độ trước (trong trường hợp cụ thể bản vẽ của bạn gửi thì nhập 380 tường ứng với cao độ điểm là 392)

 Khi líp yêu cầu nhập độ chênh cao giữa các đường đồng mức thì tùy theo chiều vẽ polyline mà nhấp giá trị dương hay âm của độ chênh cao này (trong trường hợp bản vẽ bạn gửi thì giá trị này là + hoặc - 20.

Sau đó nhấn enter và chờ líp hoàn thành công việc của nó.

5/- Check lại xem lisp ghi đúng chưa, nếu thấy chưa đúng thì undo để xóa toàn bộ những gì líp đã làm, không ảnh hưởng tới bản vẽ của bạn.

 

Lưu ý rằng trong bản vẽ bạn gửi, các đường đồng mức nằm trên nhiều layẻ khác nhau mà mình chỉ mới phát hiện được có 3 layẻ là 1,2 và 5. Khi thấy lisp bỏ sót các đường đồng mức chưa được ghi cao độ thì có thể là do đường đồng mức đó nắm khác layẻ với các layẻ kể trên và bạn phải bổ sung layẻ này vào trong bộ chọn đối tượng của lisp.

Hy vọng bạn có thể dùng được lisp này để thuận lợi cho công việc của bạn. Nếu quá trình dùng có vấn đề gì chưa rõ cứ post lên mình sẽ tìm hiểu và giải thích.

Chúc bạn vui

 

 

</p>
<p> </p>
<div>(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt )</div>
<div>(vl-load-com)</div>
<div>(setq oldos (getvar "osmode"))</div>
<div>(setvar "osmode" 0)</div>
<div>(command "undo" "be")</div>
<div>(setq pl (car (entsel "\n Chon duong dan"))</div>
<div>          plst (acet-geom-vertex-list pl ) )</div>
<div> </div>
<div>(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5")))))</div>
<div> </div>
<div>(setq cdmax (getreal "\n Nhap cao do bat dau: ")</div>
<div>          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")</div>
<div>          i 0 )</div>
<div> (foreach dm ssdml</div>
<div>         (setq els (entget dm)</div>
<div>                  cdt  (+ cdmax (* i chcd))</div>
<div>                  els (subst (cons 38 cdt ) (assoc 38 els) els)</div>
<div>                  els (subst (cons 62 2) (assoc 62 els) els) )</div>
<div>         (entmod els)</div>
<div>         (command "measure" dm   200)</div>
<div>         (setq ssp (acet-ss-to-list (ssget "p")))</div>
<div>         (foreach pt ssp</div>
<div>               (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )</div>
<div>         )</div>
<div>         (setq i (1+ i)  )</div>
<div>)</div>
<div>(command "erase" pl "")</div>
<div>(command "undo" "e")</div>
<div>(setvar "osmode" oldos)</div>
<div>(princ)</div>
<div>)</div>
<div>         

Bạn cho mình hỏi vẽ cái đường dẫn bằng pl ấy như thế nào nhỉ, chỉ cần cắt các đường đồng mức tại 1 điểm là được ah? Sao mình vẽ rồi chọn vẫn báo lỗi:  "Chon duong dan; error: no function definition: ACET-GEOM-VERTEX-LIST" . Mong bạn hướng dẫn rõ hơn chút. Cám ơn bạ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

Bạn cho mình hỏi vẽ cái đường dẫn bằng pl ấy như thế nào nhỉ, chỉ cần cắt các đường đồng mức tại 1 điểm là được ah? Sao mình vẽ rồi chọn vẫn báo lỗi:  "Chon duong dan; error: no function definition: ACET-GEOM-VERTEX-LIST" . Mong bạn hướng dẫn rõ hơn chút. Cám ơn bạn nhiều.

Hề hề hề,

1/- Đường dẫn là đường lwpolyline (vẽ bằng lệnh pline chứ không phải line) vẽ sao cho nó cắt các đường đồng mức lần lượt theo thứ tự từ cao xuống thấp hoặc từ thấp lên cao tùy theo vị trí xác định điểm chuẩn có sẵn.

2/- Lỗi  error: no function definition: ACET-GEOM-VERTEX-LIST"  là do bạn chưa cài bộ express tools của CAD.

 

@Bác DoanVanHa: Lỗi do hai nguyên nhân: 1/- Do mình hơi láu táu, nhanh nhẩu đoảng vội vàng sai bác ạ. Mình xin rút kinh nghiệm

2/- Do codebox của Cadviet có vấn đề chi đó, có lúc được lúc không mà mình không biết cách sửa. Chờ bác Hoành khắc phục.

 

@ Bác Hieptr: Ý của bác có thể làm được nhưng phải thêm việc loại trừ bản thân đường dẫn ra khỏi tập chọn các đường đồng múc bác ạ.

Bác co thể sửa code như sau:

1/- Loại bỏ bộ lọc (cons 8 "1,2,5") ra khỏi bộ lọc của hàm chọn tập chọn (ssget ......)

2/- Thêm hàm xóa bỏ đường dẫn khỏi tập chọn vào ngay dưới dòng code đó (vl-remove ....)

Cụ thể: 

1/- Thay:

(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5")))))

thành:

(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30)) )))

2/- Thêm :

(setq ssdml (vl-remove pl ssdml))

@ hongquan88: Xin lỗi bạn vì mình quên nói rằng bạn cần tạo một block thuộc tính có tên cd1 trước khi chạy lisp. Block thuộc tính này chỉ có một text số ghi giá tri cao độ của đường đồng mức. nếu bạn không thể tự tạo được block này thì hãy gửi ý tưởng của bạn lên mình sẽ chỉ cách tạo.

Chỉnh sửa theo phamthanhbinh
Bổ sung trả lời chi hongquan88

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 cho mình hỏi vẽ cái đường dẫn bằng pl ấy như thế nào nhỉ, chỉ cần cắt các đường đồng mức tại 1 điểm là được ah? Sao mình vẽ rồi chọn vẫn báo lỗi:  "Chon duong dan; error: no function definition: ACET-GEOM-VERTEX-LIST" . Mong bạn hướng dẫn rõ hơn chút. Cám ơn bạn nhiều.

Ôi, 

Không hiểu tại sao mà bài post trả lời số 7 của mình lại nhoi vào giữa bài số 4 và bài số 5 vậy. Bác hoành ơi, cứ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

Chào bác he he ! Bác ơi sao em chạy vẫn bị lỗi nhỉ ? Bác kiểm tra lại xem có gì trục chặc không nhé.. 

Hề hề hề,

Khổ quá.... Nó báo lỗi chi vậy???

Mình test thử trên bản vẽ của chủ thớt gửi thì thấy nó chạy phăm phăm. bạn hãy gửi bản vẽ của bạn test lên để mình check nhé. Việc có lỗi cũng là chuyện thường ngày ở .... quê mình mà. Vốn dĩ chỉ là dân đi mót nên cái chuyên ngành sâu xa của các bác mình chả hiểu chi nhiều, cứ đoán mò để nghịch mà thôi. Vấn đề là sai thì sửa, chửa thì đẻ giống như có bác nào đã nói rồi đó. Mình chỉ sợ sai đây lại sửa đó nên rất mong bạn chỉ cho giùm chỗ sai để còn sửa chứ nếu không thì cũng bí.....

Hề hề hề,...

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

http://www.cadviet.com/upfiles/3/77310_228074_gcddm.lsp

 

Bác ơi em thực hiện lisp nhưng bị lỗi như sau Bác Xem giúp em:

 

 Đường pline em vạch như trong ví dụ em up

 

Command: gcddm
undo Current settings: Auto = On, Control = All, Combine = Yes
Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]
<1>: be
Command:
 Chon duong dan
 Nhap cao do bat dau: 484


 

 Nhap do chenh cao giua cac duong dong muc: 5
measure
Select object to measure:
Specify length of segment or [block]: 200
Command: insert Enter block name or [?]: cd1
"cd1.dwg": Can't find file in search path:
  D:\My Documents\ (current directory)
  C:\XX dang chinh sua\
  C:\Documents and Settings\Gostep.info\Application Data\Autodesk\AutoCAD
2007\R17.0\enu\support\
  C:\Program Files\AutoCAD 2007\support\
  C:\Program Files\AutoCAD 2007\fonts\
  C:\Program Files\AutoCAD 2007\help\
  C:\Program Files\AutoCAD 2007\Express\
  C:\Program Files\AutoCAD 2007\support\color\
  C:\Program Files\AutoCAD 2007\drv\
  C:\Program Files\AutoCAD 2007\
*Invalid*
; error: Function cancelled

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

http://www.cadviet.com/upfiles/3/77310_228074_gcddm.lsp

 

Bác ơi em thực hiện lisp nhưng bị lỗi như sau Bác Xem giúp em:

 

 Đường pline em vạch như trong ví dụ em up

 

Command: gcddm

undo Current settings: Auto = On, Control = All, Combine = Yes

Enter the number of operations to undo or [Auto/Control/BEgin/End/Mark/Back]

<1>: be

Command:

 Chon duong dan

 Nhap cao do bat dau: 484

 

 

 Nhap do chenh cao giua cac duong dong muc: 5

measure

Select object to measure:

Specify length of segment or [block]: 200

Command: insert Enter block name or [?]: cd1

"cd1.dwg": Can't find file in search path:

  D:\My Documents\ (current directory)

  C:\XX dang chinh sua\

  C:\Documents and Settings\Gostep.info\Application Data\Autodesk\AutoCAD

2007\R17.0\enu\support\

  C:\Program Files\AutoCAD 2007\support\

  C:\Program Files\AutoCAD 2007\fonts\

  C:\Program Files\AutoCAD 2007\help\

  C:\Program Files\AutoCAD 2007\Express\

  C:\Program Files\AutoCAD 2007\support\color\

  C:\Program Files\AutoCAD 2007\drv\

  C:\Program Files\AutoCAD 2007\

*Invalid*

; error: Function cancelled

Hề hề hề,

Ây da da, Thì ra là cái lỗi Can't find file in search path:

 

Lỗi này là do bạn chưa tạo cái block thuộc tính cd1 đấy. Trong bài trả lời chủ thớt, mình đã có nói rồi mà. 

Bi giờ bạn chịu khó tạo một block thuộc tính với tên là cd1 chứa 1 thuộc tính là text ghi cao độ. rồi test thử lại xem sao nhé. Hoặc là bạn chờ mình tạo block này trong file bạn gửi kèm rồi gửi trả lại cho bạn để bạn 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

Bác tạo luôn block (bằng lisp) chứa text xong nổ nó ra sửa quách cho nó đỡ lẹo tẹo bá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

Bác tạo luôn block (bằng lisp) chứa text xong nổ nó ra sửa quách cho nó đỡ lẹo tẹo bác ạ!

Hề hề hề,

Đây là một cái block cd1 mình tạo ra cho nó phù hợp với bản vẽ của chủ thớt. Mọi người down về rồi tự hiệu chỉnh cho nó vừa khớp với bản vẽ của mỗi người và khớp với sở thích của mỗi designer.

http://www.cadviet.com/upfiles/3/5194_cd1.dwg

 

Trước khi chạy lisp hãy copy cái block này vào bản vẽ cần chạy.

 

Mình có chỉnh sửa lại một chút trong lisp dưới đây để tránh lỗi do dùng lệnh measure với các đường đồng mức có độ dài nhỏ hơn khoảng cách 200 như đã mặc định trong lisp. Khi người dùng cần thay đổi khoảng cách này thì lưu ý đặt lại điều kiện cho phù hợp.

 

(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt p0 ssp0)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq pl (car (entsel "\n Chon duong dan"))
          plst (acet-geom-vertex-list pl ) )
 
(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5")))))
 
(setq cdmax (getreal "\n Nhap cao do bat dau: ")
          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")
          i 0 )
 (foreach dm ssdml
         (setq els (entget dm)
                  cdt  (+ cdmax (* i chcd))
                  els (subst (cons 38 cdt ) (assoc 38 els) els)
                  els (subst (cons 62 2) (assoc 62 els) els) )
         (entmod els)
         (setq p0 (vlax-curve-getpointatdist dm 200))
         (if p0
             (progn
                   (command "measure" dm   200)
                   (setq ssp0 (ssget "p"))
                   (setq ssp (acet-ss-to-list ssp0))         
                   (foreach pt ssp
                        (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )
                   )
              )
              (command "insert" "cd1" (vlax-curve-getstartpoint dm) 1 1 0 (rtos cdt 2 0) )
         )
         (setq i (1+ i)  )
)
(command "erase" pl "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
         
Chúc mọi người luôn hạnnh phúc, vui vẻ, khỏe ngườ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

Giờ mới rảnh, lại tò mò!

1. Các bác chỉ dùm mình chổ nào (nút nào) để down cái lisp của bác Bình !<hình>

80156_tomo2.jpg

2. Mình Copy --> dán theo bác Bình chỉ thì đc cái này

(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt )
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq pl (car (entsel "\n Chon duong dan"))
          plst (acet-geom-vertex-list pl ) )
 
(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30)) ))) 
(setq cdmax (getreal "\n Nhap cao do bat dau: ")
          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")
          i 0 )
 (foreach dm ssdml
         (setq els (entget dm)
                  cdt  (+ cdmax (* i chcd))
                  els (subst (cons 38 cdt ) (assoc 38 els) els)
                  els (subst (cons 62 2) (assoc 62 els) els) )
         (entmod els)
         (command "measure" dm   200)
         (setq ssp (acet-ss-to-list (ssget "p")))
         (foreach pt ssp
               (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )
         )
         (setq i (1+ i)  )
)
(command "erase" pl "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Vẽ thử vài đường PL để chạy thử thì thấy nó bị lỗi này <hình>. Nhờ các bác xem hộ !

80156_tomo.jpg

 



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ờ mới rảnh, lại tò mò!

1. Các bác chỉ dùm mình chổ nào (nút nào) để down cái lisp của bác Bình !<hình>

 

2. Mình Copy --> dán theo bác Bình chỉ thì đc cái này

(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt )
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq pl (car (entsel "\n Chon duong dan"))
          plst (acet-geom-vertex-list pl ) )
 
(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30)) ))) 
(setq cdmax (getreal "\n Nhap cao do bat dau: ")
          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")
          i 0 )
 (foreach dm ssdml
         (setq els (entget dm)
                  cdt  (+ cdmax (* i chcd))
                  els (subst (cons 38 cdt ) (assoc 38 els) els)
                  els (subst (cons 62 2) (assoc 62 els) els) )
         (entmod els)
         (command "measure" dm   200)
         (setq ssp (acet-ss-to-list (ssget "p")))
         (foreach pt ssp
               (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )
         )
         (setq i (1+ i)  )
)
(command "erase" pl "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)

Vẽ thử vài đường PL để chạy thử thì thấy nó bị lỗi này <hình>. Nhờ các bác xem hộ !

 

 

Hề hề hề,

1/- Lỗi codebox của diễn đàn, mình không biết cách sửa.

2/- Bạn đã làm đúng. Tuy nhiên đây là code cũ chưa chỉnh sửa. Bởi vậy bạn nên làm tương tự với code mới và test với bản vẽ phù hợp.

3/- Lisp đã chạy hoàn tất chứ không hề mắc mứu chi. Tuy nhiên nó chả ra cái gì vì có thể bạn đã sử dụng bản vẽ để test chưa phù hợp với lisp.

hãy lưu ý các điểm sau đây khi sử dụng lisp này:

1/- Đường dẫn phải là một LWpolyline (vẽ bằng lệnh pline) và phải cắt lần lượt các đường đồng mức theo một chiều lên hay xuống và chỉ cắt mỗi đường đồng mức tại một điểm duy nhất. Do vậy người dùng phải vẽ đường dẫn này cho phù hợp chứ không thể vẽ tùy tiện.

2/- Các đường đồng mức trên bản vẽ phải cùng một màu số 30. (màu này là do mình viết dựa trên bản vẽ của chủ thớt gửi, người dùng khác có thể thay đổi lại trong code cho phù hợp với bản vẽ sử dụng)

3/- Do sử dụng lệnh measure nên độ dài của đường đồng mức phải lớn hơn 200 là khoảng cách giữa các điểm chia trên đường đồng mức. Nếu không sẽ có lỗi. Điều này đã được khắc phục trong code mới chỉnh sửa trong bài post #14 của topic này.

4/- Khi sử dụng lsp phải chắc chắn trên bản vẽ đã có block thuộc tính mang tên CD1 có cấu trúc giống như block mẫu mình đã post trong bài #14 nói trên.

5/- Nếu lười tạo block thuộc tính cd1 có thể sử dụng code bên dưới đây với lưu ý bổ sung là các đường đồng mức phải nằm trên một trong 3 layer sau: 1, 2, 5.

 

(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt p0 ssp0)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq pl (car (entsel "\n Chon duong dan"))
          plst (acet-geom-vertex-list pl ) )
(if (not (tblsearch "block" "cd1"))
    (atbmk "cd1")
)
 
(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5")))))
 
(setq cdmax (getreal "\n Nhap cao do bat dau: ")
          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")
          i 0 )
 (foreach dm ssdml
         (setq els (entget dm)
                  cdt  (+ cdmax (* i chcd))
                  els (subst (cons 38 cdt ) (assoc 38 els) els)
                  els (subst (cons 62 2) (assoc 62 els) els) )
         (entmod els)
         (setq p0 (vlax-curve-getpointatdist dm 200))
         (if p0
             (progn
                   (command "measure" dm   200)
                   (setq ssp0 (ssget "p"))
                   (setq ssp (acet-ss-to-list ssp0))         
                   (foreach pt ssp
                        (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )
                   )
              )
              (command "insert" "cd1" (vlax-curve-getstartpoint dm) 1 1 0 (rtos cdt 2 0) )
         )
         (setq i (1+ i)  )
)
(command "erase" pl "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun atbmk ( bln / )
;;;(setq bln (getstring "\n Nhap ten block: "))
(if (not (tblsearch "block" bln))
(progn
       (command "attdef" "" (getstring "\n Nhap att tag: ") (getstring T "\n Nhap dong nhac: ") 
                                     (getstring "\n Nhap gia tri mac dinh: ")  "J" "mc" (setq p0 (getpoint "\n Nhap diem chuan")) 0 )
       (command "scale" (entlast) "" p0 50)
       (command "block" bln p0 (entlast) "")
)
)
)
       

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

 

Hề hề hề,

1/- Lỗi codebox của diễn đàn, mình không biết cách sửa.

2/- Bạn đã làm đúng. Tuy nhiên đây là code cũ chưa chỉnh sửa. Bởi vậy bạn nên làm tương tự với code mới và test với bản vẽ phù hợp.

3/- Lisp đã chạy hoàn tất chứ không hề mắc mứu chi. Tuy nhiên nó chả ra cái gì vì có thể bạn đã sử dụng bản vẽ để test chưa phù hợp với lisp.

hãy lưu ý các điểm sau đây khi sử dụng lisp này:

1/- Đường dẫn phải là một LWpolyline (vẽ bằng lệnh pline) và phải cắt lần lượt các đường đồng mức theo một chiều lên hay xuống và chỉ cắt mỗi đường đồng mức tại một điểm duy nhất. Do vậy người dùng phải vẽ đường dẫn này cho phù hợp chứ không thể vẽ tùy tiện.

2/- Các đường đồng mức trên bản vẽ phải cùng một màu số 30. (màu này là do mình viết dựa trên bản vẽ của chủ thớt gửi, người dùng khác có thể thay đổi lại trong code cho phù hợp với bản vẽ sử dụng)

3/- Do sử dụng lệnh measure nên độ dài của đường đồng mức phải lớn hơn 200 là khoảng cách giữa các điểm chia trên đường đồng mức. Nếu không sẽ có lỗi. Điều này đã được khắc phục trong code mới chỉnh sửa trong bài post #14 của topic này.

4/- Khi sử dụng lsp phải chắc chắn trên bản vẽ đã có block thuộc tính mang tên CD1 có cấu trúc giống như block mẫu mình đã post trong bài #14 nói trên.

5/- Nếu lười tạo block thuộc tính cd1 có thể sử dụng code bên dưới đây với lưu ý bổ sung là các đường đồng mức phải nằm trên một trong 3 layer sau: 1, 2, 5.


 

(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt p0 ssp0)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq pl (car (entsel "\n Chon duong dan"))
          plst (acet-geom-vertex-list pl ) )
(if (not (tblsearch "block" "cd1"))
    (atbmk "cd1")
)
 
(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5")))))
 
(setq cdmax (getreal "\n Nhap cao do bat dau: ")
          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")
          i 0 )
 (foreach dm ssdml
         (setq els (entget dm)
                  cdt  (+ cdmax (* i chcd))
                  els (subst (cons 38 cdt ) (assoc 38 els) els)
                  els (subst (cons 62 2) (assoc 62 els) els) )
         (entmod els)
         (setq p0 (vlax-curve-getpointatdist dm 200))
         (if p0
             (progn
                   (command "measure" dm   200)
                   (setq ssp0 (ssget "p"))
                   (setq ssp (acet-ss-to-list ssp0))         
                   (foreach pt ssp
                        (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )
                   )
              )
              (command "insert" "cd1" (vlax-curve-getstartpoint dm) 1 1 0 (rtos cdt 2 0) )
         )
         (setq i (1+ i)  )
)
(command "erase" pl "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun atbmk ( bln / )
;;;(setq bln (getstring "\n Nhap ten block: "))
(if (not (tblsearch "block" bln))
(progn
       (command "attdef" "" (getstring "\n Nhap att tag: ") (getstring T "\n Nhap dong nhac: ") 
                                     (getstring "\n Nhap gia tri mac dinh: ")  "J" "mc" (setq p0 (getpoint "\n Nhap diem chuan")) 0 )
       (command "scale" (entlast) "" p0 50)
       (command "block" bln p0 (entlast) "")
)
)
)
       

 

 

Hề hề hề,

1/- Lỗi codebox của diễn đàn, mình không biết cách sửa.

2/- Bạn đã làm đúng. Tuy nhiên đây là code cũ chưa chỉnh sửa. Bởi vậy bạn nên làm tương tự với code mới và test với bản vẽ phù hợp.

3/- Lisp đã chạy hoàn tất chứ không hề mắc mứu chi. Tuy nhiên nó chả ra cái gì vì có thể bạn đã sử dụng bản vẽ để test chưa phù hợp với lisp.

hãy lưu ý các điểm sau đây khi sử dụng lisp này:

1/- Đường dẫn phải là một LWpolyline (vẽ bằng lệnh pline) và phải cắt lần lượt các đường đồng mức theo một chiều lên hay xuống và chỉ cắt mỗi đường đồng mức tại một điểm duy nhất. Do vậy người dùng phải vẽ đường dẫn này cho phù hợp chứ không thể vẽ tùy tiện.

2/- Các đường đồng mức trên bản vẽ phải cùng một màu số 30. (màu này là do mình viết dựa trên bản vẽ của chủ thớt gửi, người dùng khác có thể thay đổi lại trong code cho phù hợp với bản vẽ sử dụng)

3/- Do sử dụng lệnh measure nên độ dài của đường đồng mức phải lớn hơn 200 là khoảng cách giữa các điểm chia trên đường đồng mức. Nếu không sẽ có lỗi. Điều này đã được khắc phục trong code mới chỉnh sửa trong bài post #14 của topic này.

4/- Khi sử dụng lsp phải chắc chắn trên bản vẽ đã có block thuộc tính mang tên CD1 có cấu trúc giống như block mẫu mình đã post trong bài #14 nói trên.

5/- Nếu lười tạo block thuộc tính cd1 có thể sử dụng code bên dưới đây với lưu ý bổ sung là các đường đồng mức phải nằm trên một trong 3 layer sau: 1, 2, 5.


 

(defun c:gcddm ( / pl plst ssdml cdmax chcd i els ssp cdt p0 ssp0)
(vl-load-com)
(setq oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq pl (car (entsel "\n Chon duong dan"))
          plst (acet-geom-vertex-list pl ) )
(if (not (tblsearch "block" "cd1"))
    (atbmk "cd1")
)
 
(setq ssdml (acet-ss-to-list (ssget "f" plst (list (cons 0 "lwpolyline") (cons 62 30) (cons 8 "1,2,5")))))
 
(setq cdmax (getreal "\n Nhap cao do bat dau: ")
          chcd (getreal "\n Nhap do chenh cao giua cac duong dong muc: ")
          i 0 )
 (foreach dm ssdml
         (setq els (entget dm)
                  cdt  (+ cdmax (* i chcd))
                  els (subst (cons 38 cdt ) (assoc 38 els) els)
                  els (subst (cons 62 2) (assoc 62 els) els) )
         (entmod els)
         (setq p0 (vlax-curve-getpointatdist dm 200))
         (if p0
             (progn
                   (command "measure" dm   200)
                   (setq ssp0 (ssget "p"))
                   (setq ssp (acet-ss-to-list ssp0))         
                   (foreach pt ssp
                        (command "insert" "cd1" (cdr (assoc 10 (entget pt))) 1 1 0 (rtos cdt 2 0) )
                   )
              )
              (command "insert" "cd1" (vlax-curve-getstartpoint dm) 1 1 0 (rtos cdt 2 0) )
         )
         (setq i (1+ i)  )
)
(command "erase" pl "")
(command "undo" "e")
(setvar "osmode" oldos)
(princ)
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun atbmk ( bln / )
;;;(setq bln (getstring "\n Nhap ten block: "))
(if (not (tblsearch "block" bln))
(progn
       (command "attdef" "" (getstring "\n Nhap att tag: ") (getstring T "\n Nhap dong nhac: ") 
                                     (getstring "\n Nhap gia tri mac dinh: ")  "J" "mc" (setq p0 (getpoint "\n Nhap diem chuan")) 0 )
       (command "scale" (entlast) "" p0 50)
       (command "block" bln p0 (entlast) "")
)
)
)
       

Chào bạn.

Mình đã làm y chang như bạn nói chỉ có một điều: đến phút trót đường polyline biến mất và các đường đồng mức vẫn ko có cao độ.

bạn có thể xád định lỗi đó dùm mình ko?

Tks

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
Vào lúc 18/2/2014 tại 16:05, lontraubabanh đã nói:

 

 

Nhờ Các có thể  chỉnh sửa Lisp này sử dụng cho cad 2018 và cao độ đường đồng mức ở dạng text không Ạ giống như BV đường Bình đồ mẫu đây Ạ. Cám ơn Các Bác Nhiều

binh do mau.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

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

×