Đế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

#1161 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 02 May 2010 - 06:29 PM

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?????
  • 0

#1162 ngotheanh

ngotheanh

    biết vẽ circle

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

Đã gửi 03 May 2010 - 09:43 AM

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é!
  • 1

#1163 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 03 May 2010 - 11:21 AM

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.
  • 0

#1164 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 03 May 2010 - 06:07 PM

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<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
:::::::-----------------------------------------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:
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<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
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1165 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 04 May 2010 - 10:27 AM

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

#1166 trinhvqh

trinhvqh

    biết lệnh block

  • Members
  • PipPipPipPipPipPip
  • 408 Bài viết
Điểm đánh giá: 222 (khá)

Đã gửi 04 May 2010 - 12:07 PM

Đã 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
  • 1

#1167 codered8x

codered8x

    biết lệnh copy

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

Đã gửi 05 May 2010 - 12:03 AM

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!
  • 0

#1168 binhyenlinh

binhyenlinh

    biết zoom

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

Đã gửi 05 May 2010 - 08:59 AM

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:
  • 0

#1169 gia_bach

gia_bach

    biết lệnh adcenter

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

Đã gửi 05 May 2010 - 11:25 AM

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.c...o...ost&p=77689
  • 0

#1170 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 05 May 2010 - 06:10 PM

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

#1171 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 05 May 2010 - 07:55 PM

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:

  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#1172 ctrungdhtl

ctrungdhtl

    biết zoom

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

Đã gửi 05 May 2010 - 11:21 PM

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.
  • 0

#1173 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 05 May 2010 - 11:37 PM

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:

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<1/"(rtos tyleMCD0 2 0)">/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<1/"(rtos tyleMCD0 2 0)">/MCN(1/"(rtos tyleMCN 2 0)"): "))) sau đó.

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

#1174 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 06 May 2010 - 06:19 PM

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???
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#1175 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 06 May 2010 - 10:29 PM

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

#1176 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 07 May 2010 - 07:42 AM

Chào bạn phamthanhbinh,
Bạn cho mình hỏi mình muốn tạo một bảng hội thoại để nhập các giá trị đầu vào và các liên kết các trường, gán biến của hộp hội thoại đến biến như thế nào? Bạn có thể cho mình xin 1 ví dụ hoặc tài liệu để mình tìm hiểu thêm. Trong tay mình tài liệu ít quá nên cũng không hiểu được hết.
Cho mình hỏi thêm có hàm nào để kiểm tra Biến dạng Real hay String hay không?
ví dụ như
(if (not ( ...kiểm tra đúng là real.......)) (..thực hiện..) (...Không thực hiện...))
Hoặc
(if (not ( ...Kiểm tra đúng là string.......)) (..thực hiện..) (...Không thực hiện...))
Cảm ơn diễn đàn đã tạo cơ hội để mình học tập.
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#1177 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 07 May 2010 - 08:23 AM

Chào bạn phamthanhbinh,
...............
Cho mình hỏi thêm có hàm nào để kiểm tra Biến dạng Real hay String hay không?
ví dụ như
(if (not ( ...kiểm tra đúng là real.......)) (..thực hiện..) (...Không thực hiện...))
Hoặc
(if (not ( ...Kiểm tra đúng là string.......)) (..thực hiện..) (...Không thực hiện...))
Cảm ơn diễn đàn đã tạo cơ hội để mình học tập.

Sử dụng hàm Type
(setq a "CADVIET")
(if (not (= (type a) 'STR))
(alert "Day khong la STRING")
(alert "Day la STRING")
)
(setq a 1)
(if (not (= (type a) 'INT))
(alert "Day khong phai la so nguyen")
(alert "Day la so nguyen")
)
(setq a 1.0)
(if (not (= (type a) 'REAL))
(alert "Day khong phai la so thuc")
(alert "Day la so thuc")
)

  • 0

#1178 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 May 2010 - 10:15 AM

Chào bạn phamthanhbinh,
Bạn cho mình hỏi mình muốn tạo một bảng hội thoại để nhập các giá trị đầu vào và các liên kết các trường, gán biến của hộp hội thoại đến biến như thế nào? Bạn có thể cho mình xin 1 ví dụ hoặc tài liệu để mình tìm hiểu thêm. Trong tay mình tài liệu ít quá nên cũng không hiểu được hết.
Cho mình hỏi thêm có hàm nào để kiểm tra Biến dạng Real hay String hay không?
ví dụ như
(if (not ( ...kiểm tra đúng là real.......)) (..thực hiện..) (...Không thực hiện...))
Hoặc
(if (not ( ...Kiểm tra đúng là string.......)) (..thực hiện..) (...Không thực hiện...))
Cảm ơn diễn đàn đã tạo cơ hội để mình học tập.

Chào bạn 18011985,
Để tạo hộp thoại thì bạn cần phải tạo ra các file DCL có thể sử dụng cùng với lisp. Việc tạo ra các file này không quá khó, tuy nhiên bạn cần tham khảo thêm các tài liệu về lisp. Đây là một tài liệu mà mình đã sử dụng để tự học lisp. Tài liệu này là của cụ Jeffy Sander mà mình down về từ mạng Internet. Phần tiếng Việt là do mình tự dịch để học thôi, bạn có thể tham khảo thêm ở bản gốc tiếng Anh mà mình vẫn giữ nguyên của cụ Jeffy để hiểu chính xác điều bạn cần.
http://www.cadviet.c...lisp_tu_hoc.doc
Việc kiểm tra biến xem nó có phải là dạng chuỗi hay dạng số thực, bác Tue_NV đã hướng dẫn. Tuy nhiên bạn nhớ là lúc này biến đã phải được định nghĩa rồi, tức là người lập trình đã xác định kiểu loại của biến. Việc kiểm tra chỉ có tác dụng thông báo cho người dùng biết chứ không thể thay đổi kiểu loại của biến. Muốn thay đổi thì bạn phải định nghĩa lại biến này.
Chúc bạn thành công.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#1179 18011985

18011985

    biết lệnh properties

  • Members
  • PipPipPipPip
  • 255 Bài viết
Điểm đánh giá: 61 (tàm tạm)

Đã gửi 07 May 2010 - 12:07 PM

Cảm ơn các bạn đã giúp mình hiểu hơn về kiểm tra dữ liệu việc đó sẽ giúp mình khắc phục và tìm ra lỗi của chương trình.
Thanks
  • 0
Trăng 16 trăng tròn
Em 16 bụng ... như trăng

Hướng dẫn sử dụng diễn đàn:
Để cảm ơn hay bài viết có ích: Ấn dấu + cuối bài.
Không vừa lòng hay bài spam: Ấn dấu - cuối bài.

#1180 tdvn

tdvn

    biết lệnh rotate

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

Đã gửi 09 May 2010 - 12:34 AM

Cảm ơn các bạn đã giúp mình hiểu hơn về kiểm tra dữ liệu việc đó sẽ giúp mình khắc phục và tìm ra lỗi của chương trình.
Thanks

Trong lisp, kiểu của biến kg đc định nghĩa trước và cũng có thể thay đổi khi gán lần cuối cùng. Có nghĩa là cùng một biến x bạn có thể gán kiểu int, float, string ..., kiểu của biến là kiểu của trị đc gán cuối cùng cho biến đó. Ví dụ (setq x 5 x 5.0 x "5.0") đều đc. Tuy nhiên khi kiểm tra (type x) -> STR.
  • 0