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ị

trinhvqh    222

Lisp chạy ổn với Win32

Khoái nhất là chèn Ký hiệu Block đảm bảo màu sắc

ACA thừa nhận thua Lisp của gia_bach vụ chèn Ký hiệu này rồi.

 

Theo ý của gia_bach sau cái vụ 02 bà là có thêm 02 cột Đơn giá và Thành tiền, Tổng thành tiền

Nhưng nếu làm đến giai đoạn này thì sẽ lòi ra những lố bịch ngay

 

Khi đó, quay về lại thấy ACA không chèn được Ký hiệu tự động cũng có lý do của nó :cheers:

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
Nếu b dùng lisp của m post lên, b sẽ thấy swj khác biệt, m muốn đc như lisp kia, có nghĩa là hiện ra hộp thoại ( + - x :=), như thế sẽ tiệ hơn rất nhiều, khi mình nhập xong phép tính và chọn dấu (=) thì 1 hộp thoại khác hiện ra, cho phép b chọn số chữ số sau dấu phẩy, layer, màu sắc của kết quả, và cũng cho phép b ghi kết quả theo 2 cách, 1 là update vào text đã có sẵn, 2 là tạo mới và chèn vào màn hình, mong b có thể giúp m :cheers:
Đây là ShareWare của 1 thằng Phi viết trên font tiếng nhật. http://www.offshorecad.com.ph/eng/

giá là 200 yên ~ 40K VNĐ

bạn nên Add font Japanese để xem.

Về mặt lập trình thì không có gì khó cái chính là có anh em nào hứng thú không thôi.

Anh em nào muốn thiết kế giao diện trong LISP (dialog) thì đây là đề tài hay.

 

cal1_2.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
truongthanh    7
Mình nghĩ cad thuần tuý kg giúp đc vđ này đâu. Vđ này muốn làm đc phải có lệnh tìm đg bao hữu hiệu hơn lệnh hiện nay do cad cung cấp. Khi tìm đc hai đg bao (của đg hiện trạng và đg qui hoạch) mới tìm đc phần giao của chúng. Bạn nên tìm giải pháp khác.

cảm ơn các bạn đã quan tâm!vấn đề này mình đã giải quyết được dễ dàng bằng CIVIL 2010!

Thanks TUE_NV và bác GIA_BACH rất 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
ngotheanh    6

em muốn viết một lisp để tạo các layer nhưng em chỉ tạo được các layer có đường liền chứ không biết tạo các layer có đường nét đứt cũng như các đường tâm,...các cao thủ xin chỉ cho em 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
Tue_NV    3.841
em muốn viết một lisp để tạo các layer nhưng em chỉ tạo được các layer có đường liền chứ không biết tạo các layer có đường nét đứt cũng như các đường tâm,...các cao thủ xin chỉ cho em nhé!thanks

Chào ngotheanh

Trước hết bạn kiểm tra loại đường mà bạn định gán vào Layer đã được CAD load vào hay chưa? Nếu loại đường chưa được CAD load vào thì bạn sử dụng mã code sau để Load vào.

Ví dụ : Bạn kiểm tra loại đường CENTER đã được CAD load vào hay chưa? Nếu chưa thì Load vào

(if (not (tblsearch "LTYPE" "CENTER")) (Command "linetype" "L" "CENTER" "acad.lin" ""))

Sau đó gán loại đường Center vào Layer CADVIET

(Command "Layer" "N" "CADVIET" "LT" "CENTER" "CADVIET" "")

:cheers:

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
mCuongs    0
E có 1 cái lisp kiếm đc của bọn nước ngoài,lisp dùng để thực hiện các phép toán cộng trừ nhân chia, e thấy rất hay nhưng khổ nỗi lại bị bản quyền, mã hóa file lisp và nếu ko mua thì sẽ bị lỗi font chữ và sẽ bị tính sai kết quả, ai có thể viết lại lisp này hộ e không?

http://www.cadviet.com/upfiles/2/sd_2704allcalculator.rar

Tên lệnh là : SD_2704

Bác nào rỗi giúp e cái vụ này cái nhỉ?

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
ngotheanh    6
Chào ngotheanh

Trước hết bạn kiểm tra loại đường mà bạn định gán vào Layer đã được CAD load vào hay chưa? Nếu loại đường chưa được CAD load vào thì bạn sử dụng mã code sau để Load vào.

Ví dụ : Bạn kiểm tra loại đường CENTER đã được CAD load vào hay chưa? Nếu chưa thì Load vào

(if (not (tblsearch "LTYPE" "CENTER")) (Command "linetype" "L" "CENTER" "acad.lin" ""))

Sau đó gán loại đường Center vào Layer CADVIET

(Command "Layer" "N" "CADVIET" "LT" "CENTER" "CADVIET" "")

:cheers:

Được rồi cảm ơn bác nhiều!

à cho em hỏi luôn là nếu muốn gán màu cho một layer thì gán như thế nào, vì em tạo lisp như của bác thì nó chỉ có toàn màu trắng thô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
Tue_NV    3.841
Được rồi cảm ơn bác nhiều!

à cho em hỏi luôn là nếu muốn gán màu cho một layer thì gán như thế nào, vì em tạo lisp như của bác thì nó chỉ có toàn màu trắng thôi!

Bạn thử đoạn này :

(if (not (tblsearch "LTYPE" "CENTER")) (Command "linetype" "L" "CENTER" "acad.lin" ""))

(Command "Layer" "N" "CADVIET" "LT" "CENTER" "CADVIET" "C" "2" "CADVIET" "")

---> Gán màu số 2 (màu vàng) và đường CENTER cho Layer CADVIET

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
damvinhduy    3
load vào báo sucessful nhưng khi nhập lệnh dstt thi báo Unknown command "DSTT". Press F1 for help. Trong lệnh trên nếu thay T10A030 bằng một text khác bất kỳ có thể thay đổi kiểu TABCDEF, trong đó EF là kiểu ký tự số, TABCD có thể là chữ hoặc số thì phải làm sao. Mình chỉ cần 2 con số cuối của text thay đổi thôi còn các ký tự trước đó không quan tâm là gì. Cảm ơn Tue_NV

Tue_NV không thể giúp mình với lisp này được à. Hixhix

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 Tue_NV có thể giúp mình viết một lisp chạy trên cad 2008 để chuyển các đối lượng có tỉ lệ khác nhau về tỉ lệ hiện thời trọn trong layout ở cad 2008 được không?

Mình sẽ nói cụ thể một chút nhé: Trường hợp đơn giản nhất ví dụ trong layout mình đang vẽ các text, dim ở tỉ lệ 1:20 (Anotative=yes, Anotative scale =1:20) giờ mình muốn chuyển về tỉ lệ 1:30 (Anotative=yes, Anotative scale =1:30) để cho dim và text phù hợp với khung nhìn mới trong layout (khi chọn Anotative scale ở layout la 1:30). Nếu chuyển bằng tay các đối tượng text và dim (chọn các đối lưọng rồi chọn lại tỉ lệ anotative scale) thì lâu và các đối tượng đó đều vẫn còn cái bóng của tỉ lệ cũ (khi mình chỉ đúp vào đối tượng). Trường hợp tổng quát thì làm cho các đối tượng được chuyển ở các tỉ lệ khác nhau.

 

Lisp đó làm sao có thể quét các đối tượng cần chuyển và vừa chuyển được các đối tượng về tỉ lệ X (chỉ số Anotative scale =X) vừa làm cho các bóng đối tưọng mất đi. Giống như khi mình vẽ ban đầu các đối tượng đó với tỉ lệ X

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
Tue_NV không thể giúp mình với lisp này được à. Hixhix

Hixhix. Buồn thủi buồn thui. Tue_NV đã viết trả lời bạn ở trang trước (Viết Lisp theo yêu cầu phần 2- (trang 59)).

Bạn chưa đọc kỹ hay sao?????

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
ngotheanh    6
Bạn thử đoạn này :

(if (not (tblsearch "LTYPE" "CENTER")) (Command "linetype" "L" "CENTER" "acad.lin" ""))

(Command "Layer" "N" "CADVIET" "LT" "CENTER" "CADVIET" "C" "2" "CADVIET" "")

---> Gán màu số 2 (màu vàng) và đường CENTER cho Layer CADVIET

Hay quá! nhờ bác mà em đã làm được rồi.

cảm ơn bác nhiều nhé!

  • 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
Hay quá! nhờ bác mà em đã làm được rồi.

cảm ơn bác nhiều nhé!

Sẵn đây các bác cho em hỏi luôn vấn đề cũng có liên quan đến cái này:

+ Em tạo một kiểu đường mới bằng chức năng tạo shape và chuyển thành ltype qua công cụ Express, ngay lúc tạo xong thì em dùng được kiểu đường đấy, nhưng khi tắt bản vẽ đó đi và mở lại thì nó không còn nhận kiểu đường đó nữa, nó cứ báo thiếu loại đường đó. Vậy làm sao để loại đường đấy có sẵn khi mở bản vẽ đó lên (cũng như mở ở máy khác).

+ Khi em có file shape.shx rồi và file shape.lin làm sao có thể dùng lisp để tự động import loại đường đó vào bản vẽ (tạo file text rồi import bằng lệnh lisp).

Cảm ơn các bác trước. Mong sớm hồi âm.

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


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
phamthanhbinh    3.123
Cảm ơn bạn đã quan tâm, mình có ý tưởng như sau: "Nội suy địa chất từ mặt cắt dọc cho mặt cắt ngang không cùng tỷ lệ"

Mình đã viết những lisp bị lỗi, mình đã thử kiểm tra từng phần, đến phần đổi tỷ lệ thì bị lỗi về giá trị giữa số và chữ. Chưa tìm ra cách giải quyết nên đưa lên mong các bạn góp ý. Sau đây là lisp của mình.

(defun c:a1 (/ tyleMCD tyleMCN tyleMCD0 tyleMCN0 Test gp n diem1 diem2 i X1 X2 Y1 Y2 Y3 XX 
YY D1 D2 P1 P2 Tenlop)
(setq tyleMCD0 100)
(setq tyleMCN0 100)
(setq tyleMCD tyleMCD0)
(setq tyleMCN tyleMCN0)
;;;--------------------- Phần lặp lại lựa chọn giữa tỉ lệ đứng MCD và tỉ lệ đứng MCN chỉ kết thúc khi nhập enter------
(while (and
(/= tyleMCD "")
(progn
(initget "tyleMCD tyleMCN")
(setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))
(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")
(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))
(setq Test 1)
(setq tyleMCD0 tyleMCD)
); End of if (progn) (and)
); End progn (and)
); End progn
(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))
(progn
(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))
(setq tyleMCD0 tyleMCD)
); End progn (if)
); End if
(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))
(progn
(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))
(setq tyleMCN0 tyleMCN)
); End progn (if)
); End if
); End while
:::::::-----------------------------------------Số lớp địa chất, vị trí trên MCD, vị trí MCN---------------------
(setq n (getreal "\nSè líp: "))
(setq diem2 (getpoint "\n§iÓm thuéc ®­êng M§TN cña MCD: "))
(setq diem1 (getpoint "\n§iÓm thuéc ®­êng M§TN cña MCN: "))
(setq gp (ssget))
(setq X1 (car diem1) Y1 (cadr diem1))
(setq X2 (car diem2) Y2 (cadr diem2))
(setq i 1)
;;;----------------------------------------------Tiến hành đo và bắt đầu nội suy------------------------------
(while ((progn
(setq diema (getpoint (strcat "\n§¸y líp thø "(rtos i 2 0)": ")))
(setq Y3 (cadr diema))
(setq YY (- Y3 Y2))
(setq D1 (* YY (/ tyleMCD 1000)))
(setq D2 (* D1 (/ 1000 tyleMCN)))
(command "Copy" gp "" diem1 (list (car diem1) (- (cadr diem1) D2)) "")
(setq P1 (car diem1) P2 (+ (cadr diem1) (/ D2 2)))
(setq Tenlop (getstring "\n Líp:"))
(command "Text" "j" "mc" (List P1 P2) "1.5" "0" Tenlop )
(command "Circle" (List P1 P2) "2" )
)
(setq i (+ i 1))
(setq diem1 (list (car diem1) (+ (cadr diem1) D2)))
(setq Y2 Y3)
)
); End defun C:

PS: Check hộ mình nhé!

 

Chào bạn 18011985,

Thực tình mình chưa hiểu lắm về mục đích của bạn khi viết đoạn code sau:

(while (and

(/= tyleMCD "")

(progn

(initget "tyleMCD tyleMCN")

(setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

(setq Test 1)

(setq tyleMCD0 tyleMCD)

); End of if (progn) (and)

); End progn (and)

); End progn

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))

(progn

(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))

(setq tyleMCD0 tyleMCD)

); End progn (if)

); End if

(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

(progn

(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))

(setq tyleMCN0 tyleMCN)

); End progn (if)

); End if

); End while

 

Trong đoạn code này mình thấy có một số vấn đề nhưng do không hiểu mục đích của bạn nên khong thể sửa được, chỉ có thể chỉ ra những chỗ nghi ngờ để bạn kiểm tra lại và sửa chữa bạn nhé.

1/- (/= tyleMCD "") Ở dòng code này bạn định nghĩa biến tyleMCD là một chuỗi, điều này mâu thuẫn với việc xác định trước đó là (setq tyleMCD tyleMCD0) nghĩa là biến tyleMCD là một giá trị số bằng giá trị của biến tyleMCD0 là 100 theo dòng code (setq tyleMCD0 100)

Như vậy việc bạn đặt điều kiện thứ nhất (/= tyleMCD "") cho vòng lặp While có còn ý nghĩa nữa không???

2/- Dòng code (setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))

- Hàm getreal yêu cầu bạn nhập một số thực và trả về giá trị là một số thực theo giá trị số bạn nhập. Do vậy dòng code trên sẽ định nghĩa biến tyleMCD là một số thực theo giá trị mà bạn sẽ nhập.

Vì thế điều kiện

(or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

của bạn sẽ luôn trả về giá trị false và hàm if sẽ luôn nhận giá trị của hàm (setq tyleMCD0 tyleMCD) nghĩa là lúc này biến tyleMCD0 sẽ có giá trị bằng giá trị của biến tyleMCD như bạn đã nhập ở trên.

Từ hai lý do trên cái điều kiện của hàm While sẽ có thể hiểu là:

(while

(and

(/= tyleMCD "")

(setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(setq tyleMCD0 tyleMCD)

)

........

Nghĩa là lúc này biến tyleMCD của bạn phải là một số thực bằng giá trị bạn nhập vào và biến tyleMCD0 cũng là một số thực như vậy.

Do đó các điều kiện của các hàm if sau đó là:

(or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

và:

(or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

sẽ luôn trả về giá trị là false

 

Và thế là hàm while của bạn chẳng thực hiện thêm bất cứ nhiệm vụ nào bạn ạ.

 

Đây là cái nhận xét của mình khi đọc đoạn code trên của bạn. Có thể chưa thật đúng lắm nhưng mong bạn hãy xem kỹ những điều mình viết trên đây. Bạn hãy xem lại yêu cầu của bạn cần thực hiện và cải tạo lại đoạn code này. Hy vọng bạn sẽ thành công. Các đoạn code khác mình chưa kiểm tra kỹ được nên chưa thể góp ý gì, mong bạn thông cảm và hãy thử sửa lại đoạn code này đã nhé. Nếu có gì chưa rõ hãy post lên mọi người sẽ cùng trao đổ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
gia_bach    1.442
Có khi bạn xài Win64 giống tôi

Với Wim32 thì lisp của gia_bach rất ok

Nhưng với win64 không hiểu sao đôi lúc nó hay bị "cà tưng"

 

Lỗi phải thế nào thì không hiểu nữa bạn ạ

Đã fix lỗi trên Win 64 bit.

Do không có sẵn Win64, bạn nào sử dụng Win 64 bit vui lòng test dùm. (nếu có lỗi, vui lòng post chi tiết )

Cám ơn.

 

Code : lấy tại bài viết 1176

  • 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
trinhvqh    222
Đã fix lỗi trên Win 64 bit.

Do không có sẵn Win64, bạn nào sử dụng Win 64 bit vui lòng test dùm. (nếu có lỗi, vui lòng post chi tiết )

Cám ơn.

 

Code : lấy tại bài viết 1176

 

Ok!

Chạy rất ổn trên nền Vista 64

  • 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
codered8x    18

Mình đang cần 1 lisp vẽ taluy mà các nét ngắn và dài của taluy không vuông góc với đường đỉnh taluy mà nằm theo phương thẳng đứng( do là hình chiếu cạnh).Mình đã tìm trên diễn đàn nhưng chỉ có lisp vẽ taluy cho hình chiếu bằng.Bạn nào giúp mình với.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
binhyenlinh    0

Em đang rất cần líp copy nội dung tex. Em làm kết cấu nên rất cần cái này mỗi khi ghi kí hiệu thép.

Đợt trước cung co líp này roi nhưng chỉ dung được cho dtex thôi còn mtex thì ko được. Tại trình độ về líp kém quá nên phải nhờ các bác trên diễn đàn vậy.

:cheers: :cheers: :cry:

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


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
gia_bach    1.442
Em đang rất cần líp copy nội dung tex. Em làm kết cấu nên rất cần cái này mỗi khi ghi kí hiệu thép.

Đợt trước cung co líp này roi nhưng chỉ dung được cho dtex thôi còn mtex thì ko được. Tại trình độ về líp kém quá nên phải nhờ các bác trên diễn đàn vậy.

:cheers: :cheers: :cry:

Sử dụng chức năng tìm kiếm của diễn đàn : Search

 

tham khảo : http://www.cadviet.com/forum/index.php?sho...ost&p=77689

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 đang cần 1 lisp vẽ taluy mà các nét ngắn và dài của taluy không vuông góc với đường đỉnh taluy mà nằm theo phương thẳng đứng( do là hình chiếu cạnh).Mình đã tìm trên diễn đàn nhưng chỉ có lisp vẽ taluy cho hình chiếu bằng.Bạn nào giúp mình với.Thanks!

Chưa hiểu ý. codered8x upload file .dwg lên diễn đàn và nói rõ hơn nhé.

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


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
18011985    61
Chào bạn 18011985,

Thực tình mình chưa hiểu lắm về mục đích của bạn khi viết đoạn code sau:

(while (and

(/= tyleMCD "")

(progn

(initget "tyleMCD tyleMCN")

(setq tyleMCD (getreal (strcat "\nMCD<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

(setq Test 1)

(setq tyleMCD0 tyleMCD)

); End of if (progn) (and)

); End progn (and)

); End progn

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))

(progn

(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))

(setq tyleMCD0 tyleMCD)

); End progn (if)

); End if

(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

(progn

(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))

(setq tyleMCN0 tyleMCN)

); End progn (if)

); End if

); End while

 

Trong đoạn code này mình thấy có một số vấn đề nhưng do không hiểu mục đích của bạn nên khong thể sửa được, chỉ có thể chỉ ra những chỗ nghi ngờ để bạn kiểm tra lại và sửa chữa bạn nhé.

1/- (/= tyleMCD "") Ở dòng code này bạn định nghĩa biến tyleMCD là một chuỗi, điều này mâu thuẫn với việc xác định trước đó là (setq tyleMCD tyleMCD0) nghĩa là biến tyleMCD là một giá trị số bằng giá trị của biến tyleMCD0 là 100 theo dòng code (setq tyleMCD0 100)

Như vậy việc bạn đặt điều kiện thứ nhất (/= tyleMCD "") cho vòng lặp While có còn ý nghĩa nữa không???

2/- Dòng code (setq tyleMCD (getreal (strcat "\nMCD<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): ")))

- Hàm getreal yêu cầu bạn nhập một số thực và trả về giá trị là một số thực theo giá trị số bạn nhập. Do vậy dòng code trên sẽ định nghĩa biến tyleMCD là một số thực theo giá trị mà bạn sẽ nhập.

Vì thế điều kiện

(or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

của bạn sẽ luôn trả về giá trị false và hàm if sẽ luôn nhận giá trị của hàm (setq tyleMCD0 tyleMCD) nghĩa là lúc này biến tyleMCD0 sẽ có giá trị bằng giá trị của biến tyleMCD như bạn đã nhập ở trên.

Từ hai lý do trên cái điều kiện của hàm While sẽ có thể hiểu là:

(while

(and

(/= tyleMCD "")

(setq tyleMCD (getreal (strcat "\nMCD<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(setq tyleMCD0 tyleMCD)

)

........

Nghĩa là lúc này biến tyleMCD của bạn phải là một số thực bằng giá trị bạn nhập vào và biến tyleMCD0 cũng là một số thực như vậy.

Do đó các điều kiện của các hàm if sau đó là:

(or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

và:

(or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

sẽ luôn trả về giá trị là false

 

Và thế là hàm while của bạn chẳng thực hiện thêm bất cứ nhiệm vụ nào bạn ạ.

 

Đây là cái nhận xét của mình khi đọc đoạn code trên của bạn. Có thể chưa thật đúng lắm nhưng mong bạn hãy xem kỹ những điều mình viết trên đây. Bạn hãy xem lại yêu cầu của bạn cần thực hiện và cải tạo lại đoạn code này. Hy vọng bạn sẽ thành công. Các đoạn code khác mình chưa kiểm tra kỹ được nên chưa thể góp ý gì, mong bạn thông cảm và hãy thử sửa lại đoạn code này đã nhé. Nếu có gì chưa rõ hãy post lên mọi người sẽ cùng trao đổi

Chào bạn Phamthanhbinh,

Trước hết cảm ơn bạn đã góp ý, sau đây mình giải thích đoạn code của mình để bạn hiểu hơn.

Đoạn code

(progn

(initget "tyleMCD tyleMCN")

(setq tyleMCD (getreal (strcat "\nMCD<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn") (= tyleMCD ""))

(setq Test 1)

(setq tyleMCD0 tyleMCD)

)

Đoạn này có ý nghĩa, khi nhập giá trị là real thì (setq tyleMCD0 tyleMCD) và khi nhập giá trị là String thì nhảy đến đoạn code nhận dạng string đằng sau

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))

(progn

(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))

(setq tyleMCD0 tyleMCD)

); End progn (if)

); End if

(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

(progn

(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))

(setq tyleMCN0 tyleMCN)

); End progn (if)

); End if

Sau khi nhập giá trị cho biến tyleMCN hay tyleMCD ở trên, máy tự động trả về dòng lựa chọn

(progn

(initget "tyleMCD tyleMCN")

(setq tyleMCD (getreal (strcat "\nMCD<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn") (= tyleMCD ""))

(setq Test 1)

(setq tyleMCD0 tyleMCD)

)

Chỉ thoát giá khi giá trị của tyleMCD là "" tức khi nhập Enter hay Space.

Đó là ý nghĩa của đoạn code của mình.

Mình đang băn khoăn vì sao tyleMCD0 của mình bị lỗi. Rất mong nhận được góp ý của các bạn về bài của mình. Mong tin!!

(defun c:a1 (/ tyleMCD tyleMCN tyleMCD0 tyleMCN0 Test gp n diem1 diem2 i X1 X2 Y1 Y2 Y3 XX 
YY D1 D2 P1 P2 Tenlop)
(setq tyleMCD0 100)
(setq tyleMCN0 100)
(setq tyleMCD tyleMCD0)
(setq tyleMCN tyleMCN0)
;;;--------------------- Phần lặp lại lựa chọn giữa tỉ lệ đứng MCD và tỉ lệ đứng MCN chỉ kết thúc khi nhập enter------
(while (and
(/= tyleMCD "")
(progn
(initget "tyleMCD tyleMCN")
(setq tyleMCD (getreal (strcat "\nMCD<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): ")))
(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")
(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn") (= tyleMCD ""))
(setq Test 1)
(setq tyleMCD0 tyleMCD)
); End of if (progn) (and)
); End progn (and)
); End progn
(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))
(progn
(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))
(setq tyleMCD0 tyleMCD)
); End progn (if)
); End if
(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))
(progn
(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))
(setq tyleMCN0 tyleMCN)
); End progn (if)
); End if
); End while
:::::::-----------------------------------------Số lớp địa chất, vị trí trên MCD, vị trí MCN---------------------
(setq n (getreal "\nSè líp: "))
(setq diem2 (getpoint "\n§iÓm thuéc ®­êng M§TN cña MCD: "))
(setq diem1 (getpoint "\n§iÓm thuéc ®­êng M§TN cña MCN: "))
(setq gp (ssget))
(setq X1 (car diem1) Y1 (cadr diem1))
(setq X2 (car diem2) Y2 (cadr diem2))
(setq i 1)
;;;----------------------------------------------Tiến hành đo và bắt đầu nội suy------------------------------
(while (<= i n)
(progn
(setq diema (getpoint (strcat "\n§¸y líp thø "(rtos i 2 0)": ")))
(setq Y3 (cadr diema))
(setq YY (- Y3 Y2))
(setq D1 (* YY (/ tyleMCD 1000)))
(setq D2 (* D1 (/ 1000 tyleMCN)))
(command "Copy" gp "" diem1 (list (car diem1) (- (cadr diem1) D2)) "")
(setq P1 (car diem1) P2 (+ (cadr diem1) (/ D2 2)))
(setq Tenlop (getstring "\n Líp:"))
(command "Text" "j" "mc" (List P1 P2) "1.5" "0" Tenlop )
(command "Circle" (List P1 P2) "2" )
)
(setq i (+ i 1))
(setq diem1 (list (car diem1) (+ (cadr diem1) D2)))
(setq Y2 Y3)
)
); End defun 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
ctrungdhtl    0

Các bác ơi. Giúp em với. E gặp một bản vẽ mà khi vào model thi các hình vẽ để lộn xộn nhưng khi vào layout thì các hình vẽ đó đc đưa vào một khung bản vẽ hoàn chỉnh. Đặc biệt là họ chỉ vẽ một tỷ lệ duy nhât nhung khi vào khung nhìn đó thi có các tỷ lệ khác nhau. E k bt họ dùng cách nào mà làm dc như vậy. e co hoi máy người bạn nói là dùng khung nhìn. có bác nao hiểu rõ giảng giải giùm em vớ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
phamthanhbinh    3.123
Chào bạn Phamthanhbinh,

Trước hết cảm ơn bạn đã góp ý, sau đây mình giải thích đoạn code của mình để bạn hiểu hơn.

Đoạn code

(progn

(initget "tyleMCD tyleMCN")

(setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn") (= tyleMCD ""))

(setq Test 1)

(setq tyleMCD0 tyleMCD)

)

Đoạn này có ý nghĩa, khi nhập giá trị là real thì (setq tyleMCD0 tyleMCD) và khi nhập giá trị là String thì nhảy đến đoạn code nhận dạng string đằng sau

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))

(progn

(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))

(setq tyleMCD0 tyleMCD)

); End progn (if)

); End if

(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))

(progn

(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))

(setq tyleMCN0 tyleMCN)

); End progn (if)

); End if

Sau khi nhập giá trị cho biến tyleMCN hay tyleMCD ở trên, máy tự động trả về dòng lựa chọn

(progn

(initget "tyleMCD tyleMCN")

(setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))

(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")

(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn") (= tyleMCD ""))

(setq Test 1)

(setq tyleMCD0 tyleMCD)

)

Chỉ thoát giá khi giá trị của tyleMCD là "" tức khi nhập Enter hay Space.

Đó là ý nghĩa của đoạn code của mình.

Mình đang băn khoăn vì sao tyleMCD0 của mình bị lỗi. Rất mong nhận được góp ý của các bạn về bài của mình. Mong tin!!

(defun c:a1 (/ tyleMCD tyleMCN tyleMCD0 tyleMCN0 Test gp n diem1 diem2 i X1 X2 Y1 Y2 Y3 XX 
YY D1 D2 P1 P2 Tenlop)
(setq tyleMCD0 100)
(setq tyleMCN0 100)
(setq tyleMCD tyleMCD0)
(setq tyleMCN tyleMCN0)
;;;--------------------- Phần lặp lại lựa chọn giữa tỉ lệ đứng MCD và tỉ lệ đứng MCN chỉ kết thúc khi nhập enter------
(while (and
(/= tyleMCD "")
(progn
(initget "tyleMCD tyleMCN")
(setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): ")))
(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd")
(= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn") (= tyleMCD ""))
(setq Test 1)
(setq tyleMCD0 tyleMCD)
); End of if (progn) (and)
); End progn (and)
); End progn
(if (or (= tyleMCD "MCD") (= tyleMCD "mcd") (= tyleMCD "tyleMCD") (= tyleMCD "tylemcd"))
(progn
(setq tyleMCD (getreal (strcat "\nMCD(1/"(rtos tyleMCD0 2 0)"): ")))
(setq tyleMCD0 tyleMCD)
); End progn (if)
); End if
(if (or (= tyleMCD "MCN") (= tyleMCD "mcn") (= tyleMCD "tyleMCN") (= tyleMCD "tylemcn"))
(progn
(setq tyleMCN (getreal (strcat "\nMCN(1/"(rtos tyleMCN0 2 0)"): ")))
(setq tyleMCN0 tyleMCN)
); End progn (if)
); End if
); End while
:::::::-----------------------------------------Số lớp địa chất, vị trí trên MCD, vị trí MCN---------------------
(setq n (getreal "\nSè líp: "))
(setq diem2 (getpoint "\n§iÓm thuéc ®­êng M§TN cña MCD: "))
(setq diem1 (getpoint "\n§iÓm thuéc ®­êng M§TN cña MCN: "))
(setq gp (ssget))
(setq X1 (car diem1) Y1 (cadr diem1))
(setq X2 (car diem2) Y2 (cadr diem2))
(setq i 1)
;;;----------------------------------------------Tiến hành đo và bắt đầu nội suy------------------------------
(while ((progn
(setq diema (getpoint (strcat "\n§¸y líp thø "(rtos i 2 0)": ")))
(setq Y3 (cadr diema))
(setq YY (- Y3 Y2))
(setq D1 (* YY (/ tyleMCD 1000)))
(setq D2 (* D1 (/ 1000 tyleMCN)))
(command "Copy" gp "" diem1 (list (car diem1) (- (cadr diem1) D2)) "")
(setq P1 (car diem1) P2 (+ (cadr diem1) (/ D2 2)))
(setq Tenlop (getstring "\n Líp:"))
(command "Text" "j" "mc" (List P1 P2) "1.5" "0" Tenlop )
(command "Circle" (List P1 P2) "2" )
)
(setq i (+ i 1))
(setq diem1 (list (car diem1) (+ (cadr diem1) D2)))
(setq Y2 Y3)
)
); End defun C:

Chào bạn 18011985,

1/- Bạn chú ý rằng hàm (getreal .....) yêu cầu bạn phải nhập vào một số thực chứ không thể nhập chuỗi. Do vậy cái kết quả của hàm (setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): "))) sẽ luôn là một số thực hoặc là nil chứ không thể là một chuỗi , do vậy cái ý định của bạn định phân loại biến tyleMCD như bạn nói là không thực hiện được.

2/- Cái ý định : "Chỉ thoát giá khi giá trị của tyleMCD là "" tức khi nhập Enter hay Space." của bạn đúng ra phải là "Chỉ thoát khỏi vòng lặp While khi giá trị của tyleMCD là nil tức khi nhập Enter hay Space." Và nếu như vậy thì cái hàm (and .....) của bạn ở đây là không phù hợp. Bởi vì với hàm and này vòng lặp While sẽ chỉ thoát khi thỏa mãn cả hai điều kiện (/= tyleMCD nil) và (progn .......)

3/- Bạn hãy xem lại việc sử dụng hàm (iniget ....) ở đây vì theo mình nó không có ý nghĩa đối với việc sử dụng hàm (setq tyleMCD (getreal (strcat "\nMCD/MCN(1/"(rtos tyleMCN 2 0)"): "))) sau đó.

 

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

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


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

Cảm ơn bạn. Bạn cho mình hỏi một chút, muốn hiển thị kết quả của đối tượng dạng số hoặc dạng chữ trong cad để kiểm tra giá trị thì như thế nào?

Nếu là số thì kèm hàm (alert (rtos Biến 2 2))

Còn là chữ thì sao???

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ạn. Bạn cho mình hỏi một chút, muốn hiển thị kết quả của đối tượng dạng số hoặc dạng chữ trong cad để kiểm tra giá trị thì như thế nào?

Nếu là số thì kèm hàm (alert (rtos Biến 2 2))

Còn là chữ thì sao???

Chào bạn 18011985,

Nếu là biến dạng chữ (tức là một giá trị dạng chuỗi) bạn có thể dùng (alert Biến)

Tuy nhiên bạn cần nhớ là trong lisp mỗi biến chỉ có thể nhận một loại giá trị chứ không thể vừa có thể nhận giá trị là số, lại vừa có thể nhận giá trị là chuỗi được.

Để hiển thị giá trị của các biến , trong môi trường cad bạn chỉ cần gõ: ! tên biến trên dòng command rồi enter là xong.

Ví dụ : với đoạn lisp trên của bạn, bạn hãy xóa dấu (/ ) phía trước khi khai báo các biến đi rồi chạy lisp. Sau khi chạy xong bạn muốn kiểm tra giá trị của biến tyleMCD bạn hãy gõ !tyleMCD vào dòng nhắc command và Enter, trên dòng command sẽ hiển thị giá trị cuối cùng của biến tyleMCD.

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

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


Liên kết tới bài đăng
Chia sẻ trên các trang web khác
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×