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ị

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

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
dkkx3a    58
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.

  • 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
phamthanhbinh    3.123
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.

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

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.

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
t031285    1
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

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

  • 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
ktv14    0
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.com/upfiles/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!

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
nataca    553
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.com/upfiles/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

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
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.com/upfiles/2/51.lsp

Chúc bạn vui.

  • Vote tăng 3

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
t031285    1
Đơ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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
Đơ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é

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
ktv14    0
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!

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
790312    4
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.

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
duy782006    1.374
Đ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.

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
790312    4
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.

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
Đ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

  • 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
gia_bach    1.442
.........................

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.

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

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

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

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Tue_NV    3.841
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.com/forum/index.php?sho...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)

)

  • 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
thiep    263
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.com/upfiles/2/hoicadviet_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)
)

  • Vote tăng 2

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
dkkx3a    58
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.

 

Cảm ơn THIEP đã giúp đỡ vấn đề của mình, bây giờ thì vấn đề đường nét của BacThanhBinh được mở rộng thêm. Vấn đề cái LSP của Bác lại nảy sinh vấn đề sau khi sử dụng. Ý là khi nội suy xong thì phải hoàn thiện trắc ngang. Cái nầy em có làm vài cái LSP "cỏn con" để tạo đường gióng, viết cao độ, khoảng cách mia (tại các vị trí gấp khúc - nếu bác là dân giao thông thì dễ hiểu). Nhưng mà khi dùng xong thì đường nội suy có rất nhiều điểm phát sinh, em dùng LSP cũng như dùng "mắt" để phân biết những điểm nào thực sự thì quả là rất "đau mắt". Vì thế nếu bác vẫn còn "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" thì càng vui thêm nếu bác chỉnh lại LSP sao cho số đỉnh lớn nhất là tổng hợp số đỉnh của hai mặt cắt cần nội suy (loại đi các điểm có khoảng cách tương đối so với các trục TN như em đã nêu trong câu hỏi.

Em cảm ơn Bác nhiều. Mong Bác có nhiều lúc "rãnh rỗi" ngồi viết các LSP tiện ích cho anh em còn yếu nhờ và học hỏi thêm (thế BÁc càng vui.....hihihi ).

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
ut_cung    2

Chào các Bác!

Mình là thành viên mới của diễn đàn, mình thấy diễn đàn này thật là bổ ích, giúp đỡ anh e rất nhiều, Có rất nhiều cái để mót nhưng mà rác cũng không phải là ít do vậy quá trình mót của những người mới vào như mình không được triệt để lắm. Mình xin mạo mụi có ý kiến thế này mong các bác xem xét nếu được thì làm còn nếu sai thi bỏ qua cho.

Cách thứ nhất: Sau khi người yêu cầu đã nhận được cái lisp mong muốn thì mình xoá tấc cả các bài trước đi, chỉ để lại bài có chứa lisp cuối cùng.

Cách hai: Tạo ra một cái thư viện lisp rồi lấy tấc cả sản phẩm tạo được bỏ vào đó và đặt một cái tên sao cho dể hiểu nhất, cũng có thể tạo ra nhiều nhóm lisp khác nhau như: nhóm lisp liên quan đến block, nhóm lisp liên quan đến coppy, .......

Mình nghĩ như thế người đến sau và cả những người lâu năm muốn tìm lại một cái mình cần thì cũng dễ dàng hơn.

Chúc anh e diễn đàn sức khoẻ, một tuần làm việc hiệu quả.

Chúc diễn đàn ngày càng phát triển!

Thank!

  • 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
gia_bach    1.442
Chào các Bác!

Mình là thành viên mới của diễn đàn, mình thấy diễn đàn này thật là bổ ích, giúp đỡ anh e rất nhiều, Có rất nhiều cái để mót nhưng mà rác cũng không phải là ít do vậy quá trình mót của những người mới vào như mình không được triệt để lắm. Mình xin mạo mụi có ý kiến thế này mong các bác xem xét nếu được thì làm còn nếu sai thi bỏ qua cho.

Cách thứ nhất: Sau khi người yêu cầu đã nhận được cái lisp mong muốn thì mình xoá tấc cả các bài trước đi, chỉ để lại bài có chứa lisp cuối cùng.

Cách hai: Tạo ra một cái thư viện lisp rồi lấy tấc cả sản phẩm tạo được bỏ vào đó và đặt một cái tên sao cho dể hiểu nhất, cũng có thể tạo ra nhiều nhóm lisp khác nhau như: nhóm lisp liên quan đến block, nhóm lisp liên quan đến coppy, .......

Mình nghĩ như thế người đến sau và cả những người lâu năm muốn tìm lại một cái mình cần thì cũng dễ dàng hơn.

Chúc anh e diễn đàn sức khoẻ, một tuần làm việc hiệu quả.

Chúc diễn đàn ngày càng phát triển!

Thank!

Một ý tuởng hay!

Nhưng việc phân lọai là công việc không đơn giản ?! Xóa cái nào, để cái nào cũng phải cân nhắc !

Và ai có thời gian xung phong làm việc 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
phamthanhbinh    3.123
Cảm ơn THIEP đã giúp đỡ vấn đề của mình, bây giờ thì vấn đề đường nét của BacThanhBinh được mở rộng thêm. Vấn đề cái LSP của Bác lại nảy sinh vấn đề sau khi sử dụng. Ý là khi nội suy xong thì phải hoàn thiện trắc ngang. Cái nầy em có làm vài cái LSP "cỏn con" để tạo đường gióng, viết cao độ, khoảng cách mia (tại các vị trí gấp khúc - nếu bác là dân giao thông thì dễ hiểu). Nhưng mà khi dùng xong thì đường nội suy có rất nhiều điểm phát sinh, em dùng LSP cũng như dùng "mắt" để phân biết những điểm nào thực sự thì quả là rất "đau mắt". Vì thế nếu bác vẫn còn "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" thì càng vui thêm nếu bác chỉnh lại LSP sao cho số đỉnh lớn nhất là tổng hợp số đỉnh của hai mặt cắt cần nội suy (loại đi các điểm có khoảng cách tương đối so với các trục TN như em đã nêu trong câu hỏi.

Em cảm ơn Bác nhiều. Mong Bác có nhiều lúc "rãnh rỗi" ngồi viết các LSP tiện ích cho anh em còn yếu nhờ và học hỏi thêm (thế BÁc càng vui.....hihihi ).

Chào bạn dkkx3a,

Bác Thiep viết cái lisp nội suy này dựa trên nguyên tắc nội suy khác với cái nguyên tắc nội suy của bạn. Do mình không có chuyên môn này nên chưa hiểu rõ cái nào thì tốt hơn so với yêu cầu của bạn.

Mình xin giải thích một vài điều trong lisp này để bạn tiện việc chỉnh sửa nếu thấy cần thiết cho bạn bạn nhé. Nhân đây mình cũng xin phép bác Thiep làm cái việc này vì đây cũng là cái cách mà mình đi mót của các bác, cố gắng để hiểu từng cái các bác cho và vận dụng để có lợi cho công việc của mình. Nếu có gì sai mong các bác cứ thẳng thắn chỉ bảo thêm.

1/- Để có điểm nội suy, bác Thiep đã sử dụng hai điểm gốc trên curve và cách lấy các điểm gốc này là dựa vào hàm (vlax-curve-getpointatdist ......)

Còn bạn dkkx3a lại muốn lấy các điểm này theo một số điểm đặc biệt được xác định trước trên mỗi curve (các vertex chẳng hạn) rồi tìm điểm tương ứng trên curve còn lại.

2/- Số lượng các điểm nội suy của bác Thiep phụ thuộc vào giá trị của cái biến sc mà ở đây bác Thiep chọn sc bằng 100.

Do đó số điểm nội suy được của bác Thiep là 101 điểm. Vì thế nó làm bạn dkkx3a đau mắt. Tuy nhiên độ chính xác của phép nội suy sẽ tăng cao hơn.

Để giảm bớt số điểm nội suy này, bạn có thể đặt lại giá trị của biến sc theo mong muốn của bạn.

3/- Với phương pháp nội suy của bác Thiep, hoàn toàn không cần thiết phải có các trục định vị mắt cắt như của bạn dkkx3a và do đó rất có thể làm cho cái mặt cắt nội suy được không trùng với vị trí mà bạn dkkx3a mong muốn. (do không có chuyên môn nên thực sự mình không rõ điều này có nhất thiết phải đúng trong việc nội suy mặt cắt này hay không)

4/- Với phương pháp của bác Thiep sẽ không còn phải bận tâm tới việc sắp xếp lại tập hợp các điểm nội suy nữa do nó đã được sắp xếp sẵn theo trình tự lấy các điểm trên curve rồi.

 

Đó là một số điều mình muốn đề cập tới để bạn dkkx3a cân nhắc và lựa chọn cách chỉnh sửa lisp này sao cho phù hợp nhất với yêu cầu của bạn.

Chúc bạn vui và thành công.

  • Vote tăng 1

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
dkkx3a    58
Đó là một số điều mình muốn đề cập tới để bạn dkkx3a cân nhắc và lựa chọn cách chỉnh sửa lisp này sao cho phù hợp nhất với yêu cầu của bạn.

Chúc bạn vui và thành công.

Cảm ơn các Bác quan tâm, hai LSP này mình linh hoạt sử dụng và hiện đang hỗ trợ rất nhanh cho công việc của mình. Vấn đề của mình xin dừng ở đây. Cảm ơn các Bác. Chúc ngày mới tốt lành.

HELLO NGÀY MỚỚỚỚỚỚỚỚỚỚỚỚỚỚỚ...........................IIIIIIIIIIIIIII

  • 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×