Chuyển đến nội dung
Diễn đàn CADViet
Jin Yong

Hỏi về Lisp (thuật toán, ý tưởng, coding,...)

Các bài được khuyến nghị

Các hàm (work1)(work2)(work3) đã có chưa bạn ?

- Trường hợp a= 0 / b = 0 bạn đã lường chưa ?

  • 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

Các hàm (work1)(work2)(work3) đã có chưa bạn ?

- Trường hợp a= 0 / b = 0 bạn đã lường chưa ?

các hàm đó có cả rồi anh.bên trên thì em mới đưa ra 1 tr/ hợp nhưng các trường hợp khác xem cúng viết tương tự như cú pháp của hàm COND .anh xem cái lisp của em bên trên nhé. khi t/m Đk thứ nhất thì chỉ có trường hợp đó xảy ra -> lisp chạy và ghi ra kết quả, nếu trường hợp 1 không thỏa mản thì lisp xét đến trường hợp thứ 2 nếu thỏa mản thì nó chạy và cho kết quả cong không thì xét đến các trường hợp tiếp theo.

em 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

Mình đang hỏi là bạn đã lường các trường hợp a= 0 hoặc b=0 chưa ? Vì mình không thấy có liệt kê trong cond của bạn.

Cấu trúc cond thường dùng nhất là

(cond
((BT1) (princ "Lam cong viec 1 neu bieu thuc 1 tra ve khac Nil"))
((BT2) (princ "Lam cong viec 2 neu bieu thuc 2 tra ve khac Nil"))
....
(T (princ "Lam cong viec n neu tat ca cac bieu thuc ben tren deu tra ve Nil"))
)

Chú ý biểu thức T cuối cùng, có nghĩa nó sẽ xử lý các việc thuộc điều kiện bạn không liệt kê.

Như ví dụ bạn đưa bên trên, hãy thêm cond (T (princ "a*b = 0")) hoặc đặt thêm xử lý rõ ràng cho nó, nếu không, a=0 hoặc b = 0 thì sẽ không thuộc trường hợp nào bạn liệt kê cả, nên nó sẽ không làm việc!

 

Ngoài ra bạn phải đặt dòng Princ vào bên trong dấu ngoặc của mỗi cond, không nó sẽ bị hiểu nhầm thành điều kiện so sánh

(cond

( (and (> a 0) (> b 0))

(work1)(princ "\n dong nhac bao ket qua cua CV1 neu xay ra:") )

( (and (< a 0) (> b 0))(work2)

(princ"\n dong nhac bao ket qua cua CV2 neu xay ra:")

)

( (and (< a 0) (< b 0))(work3)

(princ"\n dong nhac bao ket qua cua CV2 neu xay ra:")

)

)

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

Em chào cả nhà ! chúc ngày cn vui vẻ ! em nhờ các bác giúp em vấn đề : Hướng dẫn em tạo Dim: kiểu dim, hight text, kiểu đường gióng, tỷ lệ,..

tạo layer và gán layer cho đôi tượ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

- Cách tạo dimstyle trên diễn đàn có kha khá rồi, bạn cố gắng tìm nhé :)

- Cách tạo 1 đối tượng Dimension mới : Có 3 cách mà mọi người cũng vẫn đang bàn luận,mình nói sơ qua với cách tạo Dimlinear, tạm thời các vấn đề rắc rối ta bỏ qua, bạn có thể dần dần tìm thấy cách ưa thích cho mình.

- Cách 1 : Dùng command : Đặc điểm là dễ xài, gõ lệnh như nào thì ta làm như vậy.

Command phụ thuộc vào các giá trị sysvar hiện hành và chế độ bắt điểm, các chế độ thiết đặt thao tác..

Sử dụng : truyền đối số cho lệnh command

(command ".dimlinear" p1 p2 p3)

p1 : điểm đo đầu

p2 : điểm đo cuối

p3 : điểm đặt đường gióng

VD : (command ".dimlinear" (getpoint) (getpoint) (getpoint))

(command "dimlinear" '(540.685 -82.53 0.0) '(248.773 92.47 0.0) '(-43.14 -15.87 0.0))

 

Hoặc đơn giản sử dụng (command ".dimlinear") (không truyền đối số)

Sau khi thực hiện xong câu lệnh trên, bạn có 1 đối tượng Dimension trên bản vẽ. Các thiết đặt của đối tượng này (tức chiều cao text, layer...) sẽ được lấy theo các giá trị sysvar hiện hành

Ví dụ : layer : "clayer" ; chiều cao Text : "dimtxt".....

Từ đây, bạn có 2 hướng để đạt được kết quả :

1- Sửa đổi các thông tin đối tượng Dimension sau khi đã tạo ra nó (entlast)

2- Đặt các sysvar theo ý đồ trước khi tạo ra nó

Thường cách thứ 2 sẽ dễ dàng hơn (nhưng có nhược điểm là bạn phải trả lại giá trị cũ cho sysvar đó), nên mình sẽ đi vào vấn đề này :

-Giả sử bạn muốn dim mới tạo có layer "1" ?

=> (setvar "clayer" "1")

Muốn text height = 10 ? => (setvar "dimtxt" 10)

Muốn màu text =3 ? => (setvar "dimclrt" 3)

....

Cứ thế, bạn nhét các dòng này vào trước dòng command dimlinear ^^ (tất nhiên, các thiết đặt này phải khác các thiết đặt của dimstyle hiện hành, nếu giống thì bạn không phải làm nữa, vì tự nó đã theo thiết đặt của dim hiện hành rồi)

 

- TÌm các sysvar đó ở đâu ?

Có 3 cách :

+ Nhảy vào Help, mục System Variables > D System Variables > và lục tung những thằng có tiền tố DIM ra đọc

+ Dùng lệnh -Dimstyle -> Status -> Hiện ra bảng các giá trị sysvar liên quan đến Dim (hầu hết) và giải thích nghĩa

+ Chọn 1 đối tượng Dim, nhấn Ctrl 1, sau đó bạn kích vào property nào thì nhìn xuống dưới cùng, sẽ thấy biến hệ thống tương ứng :)

 

- Cách 2 : tạo bằng entmake

- Cách 3 : tạo bằng ActiveX (vlisp)

..... (nhiều lắm, nói k xuể ^^)

  • 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

Bác xem giúp em đoạn code này sai chỗ nào mà chạy không được ahm:

(defun c:ttt  ()
(setq
a(getpoint "\nDiem dat.: ")
b (getpoint "\nDiem 2:"))
(setvar "DIMADEC" 0)
(setvar "DIMALTU" 2)
(setvar "DIMASO" on)
(setvar "DIMTSZ" 2)
(setvar "DIMAUNIT" 0)
(setvar "DIMCEN" 1)
(setvar "DIMCLRD" 8)
(setvar "DIMCLRT" 6)
(setvar "DIMDIMDEC" 0)
(setvar "DIMDLE" 1)
(setvar "DIMLI" 5)
(setvar "DIMEXE" 1.5)
(setvar "DIMEXO" 2)
(setvar "DIMGAP" 2)
(setvar "DIMJUST" 0)
(setvar "DIMLFAC" 1)
(setvar "DIMSHA" OFF)
(setvar "DIMTAD" 1)
(setvar "DIMTIH" OFF)
(setvar "DIMTIX" OFF)
(setvar "DIMTSZ" 2)
(setvar "DIMTXT" 4)
(command ".dimlinear"  a B)
(princ)
)

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

Vẩn không được bác ahm, khi load nó báo lỗi đử thứ, mặc dù các biến này em đã xem kỹ lại roai, mong bác sữa giúp !

thank

 

Bạn thay giá trị off bằng giá trị 0

Bạn thay giá trị on bằng giá trị 1

"DIMDIMDEC" -> "DIMDEC"

"DIMLI" -> "DIMDLI"

"DIMSHA" -> "DIMSAH"

  • 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

 

 

Bạn thay giá trị on bằng giá trị 1

"DIMDIMDEC" -> "DIMDEC"

"DIMLI" -> "DIMDLI"

"DIMSHA" -> "DIMSAH"

Em thấy trong đó tác giả có viết các biến đó : ON/OFF mà, mình cho đối số : 1 và 0 nó có nghĩa gì vậy bác, khi thay thì em đã làm ddc roay.

Và bác chỉ giúp em biến : chọn khoảng hở từ chân Dim tới đối tượng đo.

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

Em thấy trong đó tác giả có viết các biến đó : ON/OFF mà, mình cho đối số : 1 và 0 nó có nghĩa gì vậy bác, khi thay thì em đã làm ddc roay.

Và bác chỉ giúp em biến : chọn khoảng hở từ chân Dim tới đối tượng đo.

 

DIMEXO

 

Muốn check lỗi, bạn phải cho chạy từng đoạn hoặc từng dòng để phát hiện ra nó lỗi chổ nào, tìm lý do vì sao.....

Bạn load hết 1 lần, lỗi ùm bà lằn thì biết đâu mà mần hả bạn

  • 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

Em thấy trong đó tác giả có viết các biến đó : ON/OFF mà, mình cho đối số : 1 và 0 nó có nghĩa gì vậy bác, khi thay thì em đã làm ddc roay.

Và bác chỉ giúp em biến : chọn khoảng hở từ chân Dim tới đối tượng đo.

tác giả có viết các biến đó : ON/OFF cho dễ hiểu thôi. còn kiểu dữ liệu của biến đó là số nguyên, nên phải là 0 và 1

biến khoảng hở từ chân Dim tới đối tượng đo DIMEXO

 

 

PS: bạn tạo 2 dimstyle giống nhau rồi giữ 1 cái làm chuẩn, sửa cái còn lại (cái cần xác định biến gì?) rồi chọn so sánh 2 dimstyle này sẽ rõ hơn về các biến này

(khi bạn gõ lệnh dimstyle sẽ thấy có Compare)

  • 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

Chào các bác,e đang tìm hiểu về lisp,e hiểu code sau như thế này:

a1 (list (+ (car p1) a) (+ (cadr p1)) là tọa độ điểm a1 theo phương X là p1+a,theo phương Y là p1+b Nhứng khi viết như thế này thì hiểu ra sao:

(command ".rectangle" p1 (list (+ (car p1) a) (+ (cadr p1) ))

Cảm ơn các 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

Chào các bác,e đang tìm hiểu về lisp,e hiểu code sau như thế này:

a1 (list (+ (car p1) a) (+ (cadr p1) c) là tọa độ điểm a1 theo phương X là p1+a,theo phương Y là p1+c Nhứng khi viết như thế này thì hiểu ra sao:

(command ".rectangle" p1 (list (+ (car p1) a) (+ (cadr p1) c)))

Cảm ơn các bác.

Cái ký hiệu "b" và ")" nó trùng với "mặt người" B)nên tôi thay b bởi c cho dễ đọc nhé:

(command ".rectangle" p1 (list (+ (car p1) a) (+ (cadr p1) 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

Các bác cho em hỏi có khi nào mình sử dụng các hàm toán học bình thường mà kết quả thu được ở dạng chuổi không ! để chuyển về số thực thì mình dùng hàm gì !?

thank :)

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ác bác cho em hỏi có khi nào mình sử dụng các hàm toán học bình thường mà kết quả thu được ở dạng chuổi không ! để chuyển về số thực thì mình dùng hàm gì !?

thank smile.png

Để để chuyển về số thực

-> Thực hiện hàm rtos để chuyển về chuỗi

Bạn Xem thêm help 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

Các bác cho em hỏi có khi nào mình sử dụng các hàm toán học bình thường mà kết quả thu được ở dạng chuổi không ! để chuyển về số thực thì mình dùng hàm gì !?

thank smile.png

Bạn phải nói rõ là hàm nào chứ ^^. Nếu +,-,*,/ thì chắc k có chuỗi đâu ^^

Còn chuyển từ chuỗi sang số, bạn có thể tham khảo các hàm sau :atoi, atof, read

  • 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

Bạn phải nói rõ là hàm nào chứ ^^. Nếu +,-,*,/ thì chắc k có chuỗi đâu ^^

Còn chuyển từ chuỗi sang số, bạn có thể tham khảo các hàm sau :atoi, atof, read

hihi,anh xem giúp em cái code :

(defun c:vm (/ a1 a2 a3 b L1 L2 B Htn Hdm sb btc hdtc hbtl m S1 S2 L0 B0 L01 B01 Vdcg Vdtc1
          	Vdtc2 )
( setq  a1(getdist "\n nhap chieu dai canh a1:")
 a2(getdist "\n nhap chieu dai canh a2:")
 a3(getdist "\n nhap chieu dai canh a3:")
 b(getdist "\n nhap chieu rong canh b:")
 L1(getdist "\n nhap khoang cach L1:")
 L2(getdist "\n nhap khoang cach L2:")
 B(getdist "\n nhap khoang cach B:")
 Htn(getdist "\n nhap cao do tu nhien Htn:")
 Hdm(getdist "\n nhap cao do day mong Hdm:")
 sb(getdist "\n nhap so buoc mong:")
 btc(getdist "\n nhap khoang cach b thi cong:")
 hdtc(getdist "\n nhap chieu cao dao thu cong Hdtc:")
 hbtl(getdist "\n nhap chieu day be tong lot Hbtl:")
 m(getdist "\n nhap do soai cua dat m:")
 )
(setq bx(* m 2 (- (+ (- Htn Hdm) Hbtl) hdtc))
 	S1(- L2 (+ a2 (/ a3 2) (* btc 2) (* bx 2)))
  S2(- B (+ b (* btc 2) (* bx 2)))
 Hdcg(- (+ (- Htn Hdm) Hbtl) hdtc))
(cond
((and (<= S1 0) (<= S2 0))
(setq L0(+ (* L1 2) (* L2 2) (* a1 2) (* btc 2))
B0(+ (* B sb) b (* btc 2))
L01(+ L0 (* bx 2))
B01(+ B0 (* bx 2))
  Vdcg(/ (* (+ (* L0 B0) (* L01 B01) (* (+ L0 B0) (+ L01 B01))) Hdcg) 6)
  Vdtc1(* (+ sb 1) 2 (* (+ L1 a1 a2 (* btc 2)) hdtc (+ b (* btc 2))))
  Vdtc2(* (+ sb 1) (+ a3 (* btc 2)) (+ b (* btc 2)) hdtc)
Vdtc(+ Vdtc1 Vdtc2)
V(+ Vdtc Vdcg))
(princ "\n Khoang cach S1:")
(princ S1)
(princ "\n Khoang cach S2:")
(princ S1)
(princ "\n The tich dat dao thu cong:")
(princ Vdtc)
(princ "\n The tich dat dao bang co gioi:")
(princ Vdcg)
(princ "\n The tich dat dao Toan bo mong:")
(princ V)
)
((and (> S1 0) (<= S2 0))
 (setq L0(+ L1 (+ a1 a2) (* btc 2))
  L1(+ a3 (* btc 2))
  L01(+ L0 (* bx 2))
  L11(+ L1(* bx 2))
  B0(+ (* sb B) b (* btc 2))
  B01(+ B0 (* bx 2))
  Vdcg1(* 2 (/ (* (+ (* L1 B0) (* L01 B01) (* (+ L1 B0) (+ L01 B01))) Hdcg) 6))
  Vdcg2(/ (* (+ (* L01 B0) (* L11 B01) (* (+ L01 B0) (+ L11 B01))) Hdcg) 6)
 Vdcg(+ Vdcg1 Vdcg2)
 	Vdtc1(* (+ sb 1) 2 (* (+ L1 a1 a2 (* btc 2)) hdtc (+ b (* btc 2))))
  Vdtc2(* (+ sb 1) (+ a3 (* btc 2)) (+ b (* btc 2)) hdtc)
 Vdtc(+ Vdtc1 Vdtc2)
 V(+ Vdtc Vdcg))
(princ "\n Khoang cach S1:")
(princ S1)
(princ "\n Khoang cach S2:")
(princ S1)
(princ "\n The tich dat dao thu cong Vdtc:")
(princ Vdtc)
(princ "\n The tich dat dao bang co gioi Vdcg:")
(princ Vdcg)
(princ "\n The tich dat dao Toan bo mong:")
(princ V)
)
((and (<= S1 0) (> S2 0))
	(setq  L0(+ (* L1 2) (* L2 2) (* a1 2) (* btc 2))
  B0(+ b (* btc 2))
  L01(+ L0 (* bx 2))
  B01(+ B0 (* bx 2))
 Vdcg(* (/ (* (+ (* L0 B0) (* L01 B01) (* (+ L0 B0) (+ L01 B01))) Hdcg) 6) (+ sb 1))
 	Vdcg1(* 2 (/ (* (+ (* L1 B0) (* L01 B01) (* (+ L1 B0) (+ L01 B01))) Hdcg) 6))
  Vdcg2(/ (* (+ (* L01 B0) (* L11 B01) (* (+ L01 B0) (+ L11 B01))) Hdcg) 6)
 Vdtc(+ Vdtc1 Vdtc2)
V(+ Vdtc Vdcg))
(princ "\n Khoang cach S1:")
(princ S1)
(princ "\n Khoang cach S2:")
(princ S1)
(princ "\n The tich dat dao thu cong Vdtc:")
(princ Vdtc)
(princ "\n The tich dat dao bang co gioi Vdcg:")
(princ Vdcg)
(princ "\n The tich dat dao Toan bo mong:")
(princ V)
))
(princ)
)




 

sau khi nhập số liệu :

nhap chieu dai canh a1:800

 

nhap chieu dai canh a2:900

 

nhap chieu dai canh a3:2600

 

nhap chieu rong canh b:1400

 

nhap khoang cach L1:6600

 

nhap khoang cach L2:7200

 

nhap khoang cach B:4500

 

nhap cao do tu nhien Htn:-300

 

nhap cao do day mong Hdm:-2450

 

nhap so buoc mong:24

 

nhap khoang cach b thi cong:100

 

nhap chieu cao dao thu cong Hdtc:100

 

nhap chieu day be tong lot Hbtl:100

 

nhap do soai cua dat m:0.67

 

Khoang cach S1:-962.0

Khoang cach S2:-962.0

The tich dat dao thu cong:2.3265e+011

The tich dat dao bang co gioi:1.05023e+013

The tich dat dao Toan bo mong:1.07349e+013

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

Ô, mr đùa ketxu à ^^ Đó là cách thể hiện số 10e^... Muốn hiển thị nguyên bản bạn thực hiện rtos 2 trước khi princ 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

hihi,anh xem giúp em cái code :

sau khi nhập số liệu :

Mới xem qua thì thấy bạn bị nhầm khi (setq b...) và (setq B...). Biến sau đã thay biến trước mất rồi, dù "b" hay "B" cũng vậy.

  • 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

Ô, mr đùa ketxu à ^^ Đó là cách thể hiện số 10e^... Muốn hiển thị nguyên bản bạn thực hiện rtos 2 trước khi princ nhé :)

hi,số : đỏ này hả anh

The tich dat dao thu cong:2.3265e+011

The tich dat dao bang co gioi:1.05023e+013

The tich dat dao Toan bo mong:1.07349e+013

 

tại em đang còn lơ mơ lắm, anh nói rõ hơn được không ! thank :)

 

 

Mới xem qua thì thấy bạn bị nhầm khi (setq b...) và (setq B...). Biến sau đã thay biến trước mất rồi, dù "b" hay "B" cũng vậy.

 

Em quên hihi,

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 thay (princ V) bằng (princ (rtos V 2 1)) thôi :) Số 2 là cách hiển thị decimal bình thường, số 1 là số chữ số sau dấu ,

  • 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

Bạn thay (princ V) bằng (princ (rtos V 2 1)) thôi :) Số 2 là cách hiển thị decimal bình thường, số 1 là số chữ số sau dấu ,

Được roay anh ah.Em cảm hơn các bác nhé ! hàm rtos chuyển từ 1 số thành chuổi đúng không anh, mà sao mình chuyển từ cái chuổi đó về số vẫn đc nhĩ, sao mình không dùng được hàm Atof ạ !

hi :)

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

2.3265e+011 bản thân nó là 1 số thực và bằng 2.3265 x 10^11

Để in ra màn hình thì chuyển nó về string dạng Decimal với hàm rtos (real to string)

Hàm atof thì ngược lại, chuyển từ string về số thực, đối số là 1 string. Vì vậy

(atof (rtos 2.3265e+011 2 2)) vẫn bằng 2.3265e+011.

Viết lisp rất quan trọng đối số, type của đối số. Vì vậy khi gặp lỗi, bạn chịu khó dùng (type a) để kiểm tra đối số a đúng loại mình cần chưa

  • 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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

×