Đến nội dung


Hình ảnh
* * * - - 8 Bình chọn

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


  • Chủ đề bị khóa Chủ đề bị khóa
3783 replies to this topic

#401 t031285

t031285

    biết vẽ rectang

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

Đã gửi 19 November 2009 - 06:58 PM

Bạn có cần đặt nhiều layer ko mà phải khổ thế? Theo mình lisp có làm được có khi thao tác còn lâu hơn đặt layer.

Cần rất nhiều layer nên mình mới nhờ.thanks.
  • 0

#402 dkkx3a

dkkx3a

    biết lệnh trim

  • Members
  • PipPipPip
  • 190 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 19 November 2009 - 07:10 PM

Cần rất nhiều layer nên mình mới nhờ.thanks.


Bạn có thể tham khảo LISP trên của mình, nếu nhiều quá Bác chơi cách sau:
;========================
(defun taolayer(Layname_str Mau_num)
(SETVAR "CMDECHO" 0)
(if (or (< Mau_num 0)(> Mau_num 256))(quit))
(if (= (tblsearch "layer" Layname_str) nil)
(command "-layer" "N" Layname_str "c" Mau_num Layname_str "")
)
(princ)
)

(defun c:tbv()
;====muốn tạo layer THEP - 1 thì:
(taolayer "THEP" 1)
;====muốn tạo layer DUONGBAO - 2 thì:
(taolayer "DUONGBAO" 2)
;======== CU THE BAC THEM VAO
; ......
(PRINC)
)


Cứ tiếp tục, BÁc muốn mấy Layer thì cứ COPY và PATSE kèm công đoạn gõ gõ..........Là xong.
  • 1
TỰ SỰ
Biển vào chiều buồn giữa cô liêu
Sóng vỗ bờ bạc đầu con nước
Khi biển động như lòng ta chợt động
Biển ồn ào nhưng thực rất dịu êm.......

#403 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 19 November 2009 - 07:14 PM

Cảm ơn Bác ThanhBinh đã giúp đỡ (cái này em cũng rất cần), LISP chạy thật tuyệt vời, nhưng cón một số hạn chế. Em đã dùng và có chút mạo "mụi":
- Lisp của Bác chạy sai khi chế độ bắt điểm chưa tắt (em sửa lại).
- Lisp của Bác chạy xong giả sử em muốn chọn vị trí undo lại thì rất mất công (em sửa lại).
- Lisp của Bác lấy tọa độ điểm không áp dụng được với Polyline được nó chỉ áp dụng được từ anh LWPOLYLINE trở lên (thì phải). Khi load nó báo:
Chon mat cat thu nhat ben trai; error: bad argument type: lentityp nil
(Cái này em không sửa được).

Tóm lại em rất là cảm ơn Bác đã viết LSP này, để tiết kiệm thời gian cho bác (một chút) em thêm vào LISP hai cái em làm được, còn cái vấn đề thứ 3 em không làm được nên chơi thủ công bằng cách Bác Hoành chỉ:




Vậy bạn nào có nhu cầu như em thì dùng lại cái mã em đã MODY... của Bác ThanhBinh, và chơi cách thứ ba (của B.Hoành vẽ). Thì dù sao trước khi nội suy mình cũng phải xén cho hai cái mặt cắt có bề rộng bằng nhau còn gì:
Đoạn mã em thêm chút mắm múi cho các bạn "kém như em".......

Chào bạn xaakii_mboet,
Trước hết xin cám ơn bạn đã cải tạo cái lisp của mình cho thuận lợi hơn đối với người sử dụng.
Thành thật mà nói, do trình độ về lisp của mình còn hạn chế, vả lại mình lại không phải là dân giao thông hay trắc địa mà chỉ là một anh cơ khí còm, do vậy cái hiểu biết của mình về món trắc địa này cực kém. Mình xin giải thích vài điểm như sau:

1/- Cái lisp mình viết là dựa trên cái bản vẽ chính gốc của bạn dkkx3a gửi chứ mình chả có cái nào để mà kiểm nghiệm nó cả. Trên bản vẽ này thì các mặt cắt của bạn dkkx3a đều là POLYLINE cả nhưng chắc là 3dpolyline vì khi mình lấy mã dxf của nó thì được như sau:
((-1 . ) (0 . "POLYLINE") (330 . ) (5 . "4B503") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "PLINETNTN") (62 . 1) (100 . "AcDb2dPolyline") (66 . 1) (10 0.0 0.0 0.0) (70 . 0) (40 . 0.0) (41 . 0.0) (210 0.0 0.0 1.0) (71 . 0) (72 . 0) (73 . 0) (74 . 0) (75 . 0))

Do vậy mình mới phải dùng cách lấy đỉnh của các polyline này để nội suy. Nếu các mặt cắt này là các đường LWPOLYLINE thì cái lisp của mình sẽ trật chìa do phương pháp lấy đỉnh của các LWpolyline sẽ khác bạn ạ.

Cái mã dxf của một lwpolyline sẽ có dạng như sau:
((-1 . ) (0 . "LWPOLYLINE") (5 . "83") (100 . "AcDbEntity") (67 . 0) (8 . "STR") (100 . "AcDbPolyline")(90 . 5) (70 . 0) (43 . 0.0) (38 . 0.0) (39 . 0.0) (10 1.0 1.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 2.0 1.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 2.0 2.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 3.0 3.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (10 1.0 4.0) (40 . 0.0) (41 . 0.0) (42 . 0.0) (210 0.0 0.0 1.0))

Vì thế với các LWPOLYLINE, để lấy các đỉnh của nó bạn có thể sử dụng đoạn code như sau:

(defun laydinhlwpl ()
(setq a (entget (car(entsel "\n Chon duong lwpolyline"))))
(setq plst (list))
(foreach x a
(if (= 10 (car x))
(setq plst (append plst (list (cdr x)))))
)

Do đó mình chưa rõ vì sao khi bạn chạy với LWpolyline mà nó vẫn ra kết quả???

2/- Đúng là mình không sử dụng hàm (command "undo" "be") làm cho các bạn phải khổ sở khi undo. Lý do là vì trong quá trình viết, mình cứ phải chạy thử rồi undo lại từng bước để coi xem nó sai chỗ nào mà sửa. Mình xin chân thành cám ơn sự bổ sung của bạn, mình sẽ rút kinh nghiệm cho các lisp sau.

3/- Cái vụ chế độ bắt điểm cũng vậy, do mình chạy với file của bạn dkkx3a không thấy có lỗi nên mình cũng không lưu tâm. Thành thật mong bạn thông cảm, mình sẽ rút kinh nghiệm để tránh sai sót sau này.

4/- Cái mẹo của bác Hoành hay thật đấy, giờ mình mới biết, cám ơn bạn nhiều nhiều.

@ dkkx3a: Bạn lưu ý rằng mỗi loại đối tượng line, polyline, lwpolyline, spline trong cad sẽ có một cách lưu trữ riêng với các mã DXF của nó. Việc nâng cấp theo ý bạn không phải quá khó nhưng cần phải biết bạn sẽ sử dụng những loại đường nào để vẽ mặt cắt, khi đó có thể sử dụng thêm các hàm diều kiện để có thể lấy các đỉnh trong từng trường hợp một bạn ạ. Cái chốt của vấn đề chính là việc lấy được tập hợp các điểm này và sắp xếp lại nó để làm cơ sở cho các thao tác nội suy mà thôi. Công việc nội suy theo như cách bạn đã làm thì rất đơn giản, bạn có thể thấy nó trong cái lisp của mình mà bạn xaakii_mboet đã chỉnh sửa.
  • 3
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#404 xaakiii_mboet

xaakiii_mboet

    biết vẽ line

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

Đã gửi 19 November 2009 - 07:33 PM

Cảm ơn Bác ThanhBinh nhắc nhở, khi mình TEST lisp của Bác (trong CAD2004) thì khi mình TEST với các đường tự nhiên vẽ bằng 3dpolyline thì OK, còn nếu trong CAD2004 mình vẽ bằng lệnh .pline thì không được nên mới POST bài. Còn cái LW là do thói quen mình dùng trong cad2010 mình hay thấy nó tạo thành ông này. XIn lỗi bác.
  • 0

#405 t031285

t031285

    biết vẽ rectang

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

Đã gửi 19 November 2009 - 10:18 PM

Bạn dùng tạm cái này thử, chắc được:

(defun c:tbv()
(SETVAR "CMDECHO" 0)
(if (= (tblsearch "layer" "THEP") nil)
(command "-layer" "n" "THEP" "c" "1" "THEP" "")
)
(if (= (tblsearch "layer" "DUONGBAO") nil)
(command "-layer" "n" "DUONGBAO" "c" "2" "DUONGBAO" "")
)
(PRINC "\n...........Da tao xong LayEr cho ban.")
(PRINC)
)

Rất đúng ý mình ,nhưng mình có 1 ý như vầy mong bạn giúp luôn.Thí dụ sau khi đã tạo 2 layer như trên ,layer hiện hành đang là THEP ta vẽ 1 đường thẳng,chọn nó nhấn số 2 thì layer hiện hành sẽ chuyển về layer DUONG BAO và đường thẳng đó sẽ chuyển thành màu vàng,tương tự ngược lại.Chân thành cảm ơn
  • 0

#406 dkkx3a

dkkx3a

    biết lệnh trim

  • Members
  • PipPipPip
  • 190 Bài viết
Điểm đánh giá: 57 (tàm tạm)

Đã gửi 20 November 2009 - 08:23 AM

Rất đúng ý mình ,nhưng mình có 1 ý như vầy mong bạn giúp luôn.Thí dụ sau khi đã tạo 2 layer như trên ,layer hiện hành đang là THEP ta vẽ 1 đường thẳng,chọn nó nhấn số 2 thì layer hiện hành sẽ chuyển về layer DUONG BAO và đường thẳng đó sẽ chuyển thành màu vàng,tương tự ngược lại.Chân thành cảm ơn


Đơn giản nhất thì bạn dùng lệnh của list lệnh CAD như sau: (thực hiện ngay sau khi vẽ đường thẳng)

(defun c:2()
(command "-layer" "S" "DUONGBAO" "")
(command ".change" "l" "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(princ)
)



Cứ tương tự bạn triển khai với các đối tượng khác.
@@Chúc thành công. (Mình đang tập học LSP những lệnh này là đơn giản nhất của LSP, bạn nên học để dễ tùy biến cho công viêc.)
  • 1
TỰ SỰ
Biển vào chiều buồn giữa cô liêu
Sóng vỗ bờ bạc đầu con nước
Khi biển động như lòng ta chợt động
Biển ồn ào nhưng thực rất dịu êm.......

#407 ktv14

ktv14

    Chưa sử dụng CAD

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

Đã gửi 20 November 2009 - 12:12 PM

Chào bạn ktv14,
Tại bạn trình bày hơi khó hiểu nên chả ai biết bạn muốn cái gì thì quan tâm thế nào nhỉ???
Tốt nhất bạn nên có bản vẽ mẫu trong đó thể hiện rõ cái trước khi bạn dùng lisp và cái bạn muốn có sau khi dùng lisp bạn nhé. Nếu được bạn hãy tham khảo cách trình bày vấn đề của bạn dkkx3a cũng ngay trong topic này.
Khi đó mình tin là trên diễn đàn sẽ có nhiều người giúp được bạn.
Chúc bạn vui khi tham gia diễn đàn.


bản vẽ dây các huynh coi giúp có thể làm đươc 1 lisp cho kết quả như vậy ko?
http://www.cadviet.c...files/2/cad.dwg
cái này năm trước đi hội thào của autodesk, dược nghe là làm được nhưng phải là autocad dành riêng cho dân kiến trúc!
  • 0

#408 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 20 November 2009 - 12:19 PM

bản vẽ dây các huynh coi giúp có thể làm đươc 1 lisp cho kết quả như vậy ko?
http://www.cadviet.c...files/2/cad.dwg
cái này năm trước đi hội thào của autodesk, dược nghe là làm được nhưng phải là autocad dành riêng cho dân kiến trúc!

Cái này dùng Wipeout trong block cửa là được chứ đâu cần phải dùng đến lisp
  • 0

#409 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

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

Đã gửi 20 November 2009 - 12:20 PM

Cảm ơn Bác ThanhBinh nhắc nhở, khi mình TEST lisp của Bác (trong CAD2004) thì khi mình TEST với các đường tự nhiên vẽ bằng 3dpolyline thì OK, còn nếu trong CAD2004 mình vẽ bằng lệnh .pline thì không được nên mới POST bài. Còn cái LW là do thói quen mình dùng trong cad2010 mình hay thấy nó tạo thành ông này. XIn lỗi bác.

Chào bạn Xaakiii_mboet,
Cái lisp này mình đã nâng cấp từ cái lisp cũ với mục đích dùng được cả với các mặt cắt vẽ bằng đường LWPOLYLINE. Bạn chú y là các đường vẽ bằng lệnh pline trong cad2004 là đường lwpolyline đấy nhé chứ không phải POLYLINE đâu. Bạn hãy thử xem nhé.
http://www.cadviet.c...pfiles/2/51.lsp
Chúc bạn vui.
  • 3
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#410 t031285

t031285

    biết vẽ rectang

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

Đã gửi 20 November 2009 - 07:39 PM

Đơn giản nhất thì bạn dùng lệnh của list lệnh CAD như sau: (thực hiện ngay sau khi vẽ đường thẳng)

defun c:2()
(command "-layer" "S" "DUONGBAO" "")
(command ".change" "l" "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(princ)
)

Cứ tương tự bạn triển khai với các đối tượng khác.
@@Chúc thành công. (Mình đang tập học LSP những lệnh này là đơn giản nhất của LSP, bạn nên học để dễ tùy biến cho công viêc.)

Bạn kiểm tra lại giùm mình,mình dùng đoạn lisp đầu tiên của bạn để tạo 2 layer THEP và DUONGBAO,Khi layer hiện hành đang là THEP mình vẽ 1 đoạn thẳng,sử dụng lisp thứ 2 này khi chọn đường thẳng rồi nhấn số 2 nó không chuyển thành màu vàng và tên là DUONG BAO.Chân thành cảm ơn.
  • 0

#411 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 20 November 2009 - 07:53 PM

Đơn giản nhất thì bạn dùng lệnh của list lệnh CAD như sau: (thực hiện ngay sau khi vẽ đường thẳng)

defun c:2()
(command "-layer" "S" "DUONGBAO" "")
(command ".change" "l" "" "p" "c" "bylayer" "la" "DUONGBAO" "")
(princ)
)

Cứ tương tự bạn triển khai với các đối tượng khác.
@@Chúc thành công. (Mình đang tập học LSP những lệnh này là đơn giản nhất của LSP, bạn nên học để dễ tùy biến cho công viêc.)

Bạn kiểm tra lại giùm mình,mình dùng đoạn lisp đầu tiên của bạn để tạo 2 layer THEP và DUONGBAO,Khi layer hiện hành đang là THEP mình vẽ 1 đoạn thẳng,sử dụng lisp thứ 2 này khi chọn đường thẳng rồi nhấn số 2 nó không chuyển thành màu vàng và tên là DUONG BAO.Chân thành cảm ơn.

Chào bạn t031285
Trong code của bạn dkkx3a có thiếu dấu mở ngoặc ( trước chữ defun c:2()
Bạn thêm dấu mở ngoặc ( rồi chạy lại thử nhé
  • 2

#412 ktv14

ktv14

    Chưa sử dụng CAD

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

Đã gửi 21 November 2009 - 10:49 AM

Cái này dùng Wipeout trong block cửa là được chứ đâu cần phải dùng đến lisp

Wipeout trong block ? mình muốn xử lý toàn bộ bằng một lệnh cho nhanh hơn chứ lệnh Wipeout thì lâu hơn nhiều thao tác mà còn không làm đươc đối với lớp hồ tô trong trường hợp thứ 2 mà hình như lệnh Wipeout dùng trong trường hợp 1 cũng che đi nét tường mất rồi!
  • 0

#413 790312

790312

    biết lệnh fillet

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

Đã gửi 21 November 2009 - 11:24 AM

Bạn dùng tạm cái này thử, chắc được:

(defun c:tbv()
(SETVAR "CMDECHO" 0)
(if (= (tblsearch "layer" "THEP") nil)
(command "-layer" "n" "THEP" "c" "1" "THEP" "")
)
(if (= (tblsearch "layer" "DUONGBAO") nil)
(command "-layer" "n" "DUONGBAO" "c" "2" "DUONGBAO" "")
)
(PRINC "\n...........Da tao xong LayEr cho ban.")
(PRINC)
)

Đoạn lisp này rất hay nhưng nếu thêm vào khi tạo xong có loại ltype và lweight luôn thì rất tuyệt.thí dụ như layer THEP là loại CONTINUOUS và lweight là 0.4,layer DUONG BAO la loại CONTINUOUS và lweight là 0.2.Mong bác hoàn thiện giùm luôn.Thanks.
  • 0

#414 duy782006

duy782006

    PHẠM QUỐC DUY

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

Đã gửi 21 November 2009 - 11:36 AM

Đoạn lisp này rất hay nhưng nếu thêm vào khi tạo xong có loại ltype và lweight luôn thì rất tuyệt.thí dụ như layer THEP là loại CONTINUOUS và lweight là 0.4,layer DUONG BAO la loại CONTINUOUS và lweight là 0.2.Mong bác hoàn thiện giùm luôn.Thanks.

Những việc như này tốt nhất tạo 1 bản vẽ mẫu có hết các thứ sau đó dùng lisp chèn vào như vậy là ok nhất.
  • 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


#415 790312

790312

    biết lệnh fillet

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

Đã gửi 21 November 2009 - 08:35 PM

Những việc như này tốt nhất tạo 1 bản vẽ mẫu có hết các thứ sau đó dùng lisp chèn vào như vậy là ok nhất.

Cái này mình cũng đã làm nhưng khi ta tạo bản vẽ mẫu khi chưa vẽ hết những layer đã tạo,mà dân vẽ nhiều thì có thói quen vẽ 1 chút lại dùng lệnh PU,khi dùng lệnh này thì những layer chưa vẽ sẽ bị xoá hết.Mong các bạn giúp.Thanks.
  • 0

#416 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 22 November 2009 - 09:49 AM

Đoạn lisp này rất hay nhưng nếu thêm vào khi tạo xong có loại ltype và lweight luôn thì rất tuyệt.thí dụ như layer THEP là loại CONTINUOUS và lweight là 0.4,layer DUONG BAO la loại CONTINUOUS và lweight là 0.2.Mong bác hoàn thiện giùm luôn.Thanks.

Bạn sử dụng code này thử nhé :
(defun c:taoLayer()
(SETVAR "CMDECHO" 0)
(loadltype)
(taolay "THEP" 1 "continuous" 0.4)
(taolay "DUONGBAO" 2 "continuous" 0.2)
(PRINC "\n...........Da tao xong LayEr cho ban.")
(PRINC)
)
;
(defun loadltype() ; Load Linetype -> neu chua co thi Load
(if (not (tblsearch "LTYPE" "continuous"))
(command "._linetype" "load" "continuous" "acad.lin" "")
);if
)
;
(defun taoLay(ten mau Lt Lw) ; tao Layer
(command "._layer" "N" ten "C" mau ten "Ltype" Lt ten "LW" lw ten "")
)


@790312 : Phía trên là code mà Tue_NV viết theo ý bạn và Tue_NV ủng hộ ý kiến của anh Duy. Ý kiến anh Duy là 1 ý hay. Bạn nên làm theo. Néu user có sử dụng lệnh PU thì mình đồng ý với bạn là các Layer, Textstyle, Dimstyle, Block...sẽ mất nhưng nếu bạn sử dụng Lisp hoặc lệnh Adcenter của CADdể chèn mọi thứ như : Layer, Textstyle, Dimstyle, Block...từ bản vẽ mẫu thì mọi thứ sẽ trở lại bản vẽ của bạn từ bản vẽ chuẩn nếu bạn đã lỡ PU. Mong rằng bạn hiểu ý của Tue_NV
  • 1

#417 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 22 November 2009 - 02:48 PM

.........................
Tue_NV ủng hộ ý kiến của anh Duy. Ý kiến anh Duy là 1 ý hay. Bạn nên làm theo. Néu user có sử dụng lệnh PU thì mình đồng ý với bạn là các Layer, Textstyle, Dimstyle, Block...sẽ mất nhưng .........................

Mình sử dụng cách sau để đề phòng chuyện user dùng lệnh PURGE sẽ xóa hết các thiết lập ban đầu :
1/ - trước tiên cũng tạo 1 bản vẽ mẫu có hết các thứ như ý kiến của bạn duy782006
2/ - tạo bản vẽ template rồi Insert bản vẽ ở bước 1 dưới dạng 1 Block, Scale block này xuống kích thước đủ nhỏ (tùy ý chủ quan mỗi người) mục đích khỏi làm User "vướng mắt" ra tay xóa mất.

Khi sử dụng bản vẽ ở bước 2 làm Template thì lệnh PURGE sẽ không xóa được các thiết lập ban đầu.
  • 0

#418 790312

790312

    biết lệnh fillet

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

Đã gửi 22 November 2009 - 03:57 PM

sẽ mất nhưng nếu bạn sử dụng Lisp hoặc lệnh Adcenter của CADdể chèn mọi thứ như : Layer, Textstyle, Dimstyle, Block...từ bản vẽ mẫu thì mọi thứ sẽ trở lại bản vẽ của bạn từ bản vẽ chuẩn nếu bạn đã lỡ PU. Mong rằng bạn hiểu ý của Tue_NV
[/quote]
Bác có thể đưa lisp này lên hoặc chỉ e sử dụng lệnh ADCENTER này được không?Thanks
  • 0

#419 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

  • Moderator
  • PipPipPipPipPipPipPip
  • 4296 Bài viết
Điểm đánh giá: 3804 (đỉnh cao)

Đã gửi 22 November 2009 - 05:14 PM

Mình sử dụng cách sau để đề phòng chuyện user dùng lệnh PURGE sẽ xóa hết các thiết lập ban đầu :
1/ - trước tiên cũng tạo 1 bản vẽ mẫu có hết các thứ như ý kiến của bạn duy782006
2/ - tạo bản vẽ template rồi Insert bản vẽ ở bước 1 dưới dạng 1 Block, Scale block này xuống kích thước đủ nhỏ (tùy ý chủ quan mỗi người) mục đích khỏi làm User "vướng mắt" ra tay xóa mất.

Khi sử dụng bản vẽ ở bước 2 làm Template thì lệnh PURGE sẽ không xóa được các thiết lập ban đầu.

Tán thành ý kiến của anh gia bach và anh Duy.
Tue_NV có ý kiến như thế này :
1/ Tạo 1 bản vẽ mẫu có đầy đủ các thứ : LAYER, Textstyle, Dimstyle, Linestyle, Block như ý anh Duy
2./ - tạo bản vẽ template rồi Insert bản vẽ ở bước 1 dưới dạng 1 Block : như ý của anh gia bách
3./ Tạo 1 LAYER mang tên là : LAYERLOCK : tức là Layer bị khoá. và thực hiện thao tác khoá LAYERLOCK -> Gán Block vừa mới Insert vào LAYERLOCK -> Như vậy User sẽ không thể dùng PU và cũng không thể Erase được Block này.
Còn nếu User muốn UNLOCK Layer và xoá cái Block vừa chèn này đi thì đây là 1 hành động có chủ đích phải không bạn 790312?

@790312 : Về lệnh ADCADCENTER : Bạn đọc bài viết đầu tiên của OIZDOI_OI
Link đây : http://www.cadviet.c...o...ic=7002&hl=

Còn Lisp thì Tue_NV viết dựa vào các ý trên của mình :
Bạn tạo bản vẽ mẫu trong ổ D:// chẳng hạn có tên là BVCHUAN.dwg
Và chạy Lisp sau -> Nó sẽ chèn BVCHUAN vào bản vẽ của bạn.
Bạn có thể định lại tỉ lệ Block trong Lisp vừa đủ nhỏ để khỏi vướng màn hình nhé và đương nhiên User sẽ không làm gì với Block này được vì nó đã bị LOCK

Code đây :

(defun c:bvc()
(SETVAR "CMDECHO" 0)
(command "layer" "N" "LAYERLOCK" "LO" "LAYERLOCK" "")
(command "insert" "D:\\BVchuan.dwg" '(0 0 0) "1" "1" "0")
(command "chprop" "L" "" "LA" "LAYERLOCK" "")
(command "zoom" "e")
(princ)
)

  • 1

#420 thiep

thiep

    biết dimbaseline

  • Members
  • PipPipPipPipPip
  • 369 Bài viết
Điểm đánh giá: 260 (khá)

Đã gửi 23 November 2009 - 10:27 AM

Cảm ơn các bác quan tâm, em đã làm lại file Cad của em để các bác hiểu hơn. EM cảm ơn các Bác.
Link: http://www.cadviet.c...oicadviet_1.dwg

Chào bạn xaakii_mboet,
Trước hết xin cám ơn bạn đã cải tạo cái lisp của mình cho thuận lợi hơn đối với người sử dụng.
Thành thật mà nói, do trình độ về lisp của mình còn hạn chế, vả lại mình lại không phải là dân giao thông hay trắc địa mà chỉ là một anh cơ khí còm, do vậy cái hiểu biết của mình về món trắc địa này cực kém.

Cái lisp mình viết là dựa trên cái bản vẽ chính gốc của bạn dkkx3a gửi chứ mình chả có cái nào để mà kiểm nghiệm nó cả. Trên bản vẽ này thì các mặt cắt của bạn dkkx3a đều là POLYLINE cả nhưng chắc là 3dpolyline Do vậy mình mới phải dùng cách lấy đỉnh của các polyline này để nội suy. Nếu các mặt cắt này là các đường LWPOLYLINE thì cái lisp của mình sẽ trật chìa do phương pháp lấy đỉnh của các LWpolyline sẽ khác bạn ạ.

Chào dkkx3a, lâu lâu Thiep cũng tranh thủ lúc rảnh rỗi viết 1 cái lisp giúp anh em cho vui.
Lisp này không kén đường mặt cắt của bạn là gì, có thể là SPLINE, LWPOLYLINE, POLYLINE, ARC, thậm chí là các đường cong kín ... gọi chung CURVẸ. Lisp yêu cầu user pick CURVẸ đường mặt cắt thứ I, pick CURVẸ đường mặt cắt thứ II, đưa vào tỷ lệ vị trí mặt cắt cần nội suy: giả sử khoảng cách giữa 2 mặt cắt I và II là 200, khoảng cách giữa mặt cắt I và mặt cắt nội suy là 25, thì tỷ lệ vị trí mặt cắt cần nội suy là 25/200 = 12.5 Cái này bạn phải chia tỷ lệ trước bên ngoài.
Lisp này cũng có thể dùng để nội suy 1 đường contour phụ từ 2 đường contour chính, tuy nhiên 2 đường contour chính phải có 2 node đầu (STARTPOINT) phải gần nhau nhất.
;| lisp noi suy mat cat, contour phu
Copyright by THIEP
Yeu cau phai cai dat expresstool |;
;;;--------------------------
(defun pnoisuy (p1 p2 k / enL len po)
(entmake (list (cons 0 "line")
(cons 10 P1)
(cons 11 P2)
)
)
(setq enL (entlast)
len (* (distance p1 p2) k)
po (vlax-curve-getPointAtDist enL len)
)
(entdel enL)
po
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(vl-load-com)
(defun c:nsmc (/ en1 en2 l1 l2 sc ps1 ps2 pns lstp len1 len2 d1 d2 p1 p2
Oldpd)
(setq Oldos (getvar "osmode"))
(setvar "osmode" 0)
(command "undo" "be")
(setq en1 (car (entsel "\nChon curve thu I"))
Obj1 (vlax-ename->vla-object en1)
l1 0
l2 0
sc 100
)
(setq en2 (car (entsel "\nChon curve thu II"))
Obj2 (vlax-ename->vla-object en2)
)
(setq K (getreal "\nChon ti le vi tri cua curve noi suy: ")
ps1 (vlax-curve-getStartPoint Obj1)
ps2 (vlax-curve-getStartPoint Obj2)
pns (pnoisuy ps1 ps2 k)
lstp (list pns)
)
(command ".lengthen" en1 "")
(setq len1 (getvar "perimeter"))
(command ".lengthen" en2 "")
(setq len2 (getvar "perimeter"))
(setq d1 (/ len1 sc)
d2 (/ len2 sc)
)
(repeat sc
(setq l1 (+ l1 d1)
p1 (vlax-curve-getPointAtDist en1 l1)
l2 (+ l2 d2)
p2 (vlax-curve-getPointAtDist en2 l2)
pns (pnoisuy p1 p2 k)
lstp (append lstp (list pns))
)
)
(ACET-LWPLINE-MAKE (list lstp))
(command "undo" "en")
(setvar "osmode" Oldos)
(princ)
)

  • 2