Đến nội dung


Hình ảnh

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


  • Please log in to reply
16 replies to this topic

#1 hongquan88

hongquan88

    biết zoom

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

Đã gửi 06 March 2013 - 04:33 PM

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...1sp0gselxtwnkxt


  • 0

#2 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 07 March 2013 - 10:52 AM

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


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#3 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 07 March 2013 - 02:53 PM

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

  • 1
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#4 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 07 March 2013 - 10:34 PM

để 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)


  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#5 Doan Van Ha

Doan Van Ha

    biết lệnh adcenter

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

Đã gửi 07 March 2013 - 11:11 PM

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


  • 1

* Chỉ nên yêu cầu Lisp khi bạn làm việc đó mất cả ngày nhưng họ chỉ viết 1 giờ. Đừng nêu yêu cầu Lisp khi bạn chỉ làm 1 giờ nhưng bắt họ phải mất cả ngày.

* Nhờ viết lisp cũng như đi khám bệnh. Chỉ gởi căn cước và than sắp chết thì không bác sỹ nào cứu sống được.


#6 hongquan88

hongquan88

    biết zoom

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

Đã gửi 08 March 2013 - 09:55 AM

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.


  • 0

#7 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 08 March 2013 - 10:47 AM

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.


Bài viết đã được chỉnh sửa nội dung bởi phamthanhbinh: 09 March 2013 - 09:53 AM
Bổ sung trả lời chi hongquan88

  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#8 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 08 March 2013 - 10:51 AM

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.


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#9 Trang72

Trang72

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 13 March 2013 - 08:03 PM

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


  • 0

#10 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 14 March 2013 - 10:51 AM

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ề,...


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#11 Trang72

Trang72

    biết vẽ ellipse

  • Members
  • PipPip
  • 51 Bài viết
Điểm đánh giá: -2 (bình thường)

Đã gửi 14 March 2013 - 12:29 PM

http://www.cadviet.c...28074_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


  • 0

#12 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 14 March 2013 - 01:39 PM

http://www.cadviet.c...28074_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


  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#13 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 14 March 2013 - 02:44 PM

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 ạ!


  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#14 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 14 March 2013 - 05:11 PM

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.c.../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.

  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#15 hiepttr

hiepttr

    Edu level: li10

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

Đã gửi 14 March 2013 - 05:48 PM

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

 




  • 0

Có vợ dù dữ dù hiền , bạn đều có lợi
_ Nếu vợ hiền, bạn sẽ là người đàn ông sung sướng
_ Nếu vợ dữ, bạn sẽ thành ... triết gia !

Bergson


#16 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6009 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 15 March 2013 - 02:25 PM

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) "")
)
)
)
       

  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#17 lontraubabanh

lontraubabanh

    Chưa sử dụng CAD

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

Đã gửi 18 February 2014 - 04:05 PM

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


  • 0


Trở lại San nền - Giao thông