Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
ustoichivost

Lisp vẽ đồ thị

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

Mình vừa viết được Lisp này dùng để vẽ đồ thị trong AutoCAD.Nhưng còn một số điểm không ưng ý lắm.Mong mọi người đọc rồi ghóp ý cho mình nha :

 

; Lisp ve do thi ;

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;Cac bien SizeX , SizeY

(defun C:Gr ( / SupX SupY SizeX SizeY TickX TickY )

; Part 1 : SizeXY , nhap do dai cua truc X va truc Y cua do thi

(defun SizeXY()

(setq

SizeX (getreal "Nhap vao do dai truc X, mm = ")

SizeY (getreal "Nhap vao do dai truc Y, mm = ")

)

)

;Part 2 : LimitXY , nhap gioi han tren gioi cua X va Y

(defun LimitXY ()

(setq

SupX (getreal "Gioi han tren cua truc X = " )

InfX (getreal "Gioi han duoi cua truc X = " )

SupY (getreal "Gioi han tren cua truc Y = " )

InfY (getreal "Gioi han duoi cua truc Y = " )

ScaleX (/ SizeX (- SupX InfX))

ScaleY (/ SizeY (- SupY InfY))

)

)

;Part 3 , TicksXY , nhap gia tri tick theo truc X va Y

( defun TicksXY ()

(setq

TickX (getreal "Gia tri tick cua truc X = ")

TickY (getreal "Gia tri tick cua truc Y = ")

)

)

;Part 4 , Ve ra cac truc toa do va danh cac diem Tick

( defun TS()

;Luu bien he thong bat diem

(setq

OldOS (getvar "OSMODE")

)

; Ve ra hai truc X va Y ,gan Origin lam goc toa do

(setq

Goc(getpoint "Chi ra diem goc toa do : ")

)

(command "UCS" Goc "")

(setq

VerX (list SizeX 0 0)

VerY (list 0 SizeY 0)

)

(setvar "OSMODE" 0)

(command "LINE" '(0 0 0) VerX "")

(command "LINE" '(0 0 0) VerY "")

;Danh dau cac diem Ticks

(setvar "PDMODE" 2)

(setvar "PDSIZE" 0.5)

(setq

NX (fix (/ (- SupX InfX) TickX))

NY (fix (/ (- SupY InfY) TickY))

)

;Danh dau tren truc Ox

(setq i 0)

(repeat NX

(setq

i (1+ i)

PoX (list (* (* i TickX) ScaleX) 0 0 )

)

(command "POINT" PoX )

)

;Danh dau tren truc Oy

(setq i 0)

(repeat NY

(setq

i (1+ i)

PoY (list 0 (* (* i TickY) ScaleY) 0)

)

(command "POINT" PoY )

)

)

;Part 5 , InDraw , nhap bo diem

(defun InDraw(/ ValueX ValueY Next1 Next2 Po )

;Gan ban dau cho cac bien dem

(setvar "OSMODE" 0)

(setq Next1 "Y")

( while (/= Next1 "N")

( princ (strcat "Vao bo diem thu : " (itoa Co1) "\n"))

(setq Next2 "Y")

(while (/= Next2 "N")

(setq

Co2 (1+ Co2)

ValueX (getreal "Nhap gia tri cua X : ")

ValueY (getreal "Nhap gia tri cua Y : ")

Po(vl-list* (* (- ValueX InfX) ScaleX) (* (- ValueY InfY) ScaleY) '(0))

Next2 (strcase (getstring (strcat "Ban muon nhap tiep diem vao bo diem nay ko ? (Y/N) <" "Y" "> :" )))

)

(command "POINT" Po)

)

(setq Co1 (1+ Co1))

(setq Next1 (strcase (getstring (strcat "Ban muon nhap tiep mot bo diem nua ko ? (Y/N)<" "Y" "> :") )))

)

(setvar "OSMODE" OldOS)

)

(princ "Ve do thi \n")

(setq Co1 1 Co2 0)

(SizeXY)

(LimitXY)

(TicksXY)

(TS)

(Indraw)

(terpri)

)

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ó vấn đề ở đây mình muốn thay lệnh POINT bằng lệnh ARRAY , nhưng thấy hơi khó trong việc tự động chọn đối tượng.

Còn nữa làm sao trong vòng lặp mình tạo được cặp điểm ('(0 0 0) '(1 1 0) '(2 1 0) '(5 5 0) '(6 4 0)).Kiểu kiểu như thế !

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ó vấn đề ở đây mình muốn thay lệnh POINT bằng lệnh ARRAY , nhưng thấy hơi khó trong việc tự động chọn đối tượng.

Còn nữa làm sao trong vòng lặp mình tạo được cặp điểm ('(0 0 0) '(1 1 0) '(2 1 0) '(5 5 0) '(6 4 0)).Kiểu kiểu như thế !

Chào bạn Ustoichivost,

Mình chưa hiểu lắm cái ý tưởng vẽ đồ thị của bạn. Có vài thắc mắc như sau:

1/- Vì sao bạn cần nhập giá trị độ dài trục x và độ dài trục y, giá trị nhỏ nhất và lớn nhất của các trục. Theo mình khi vẽ đồ thị thì đâu cần phải như vậy, tự bản thân các giá trị tọa độ điểm mà bạn nhập vào nó sẽ quyết định điều đó rồi. Hay là ở đây bạn muốn vẽ đồ thị theo một tỷ lệ định trước nào đó của mỗi trục, nghĩa là không phải trên hệ trục tọa độ Đề cac vuông góc, mà là mỗi trục có hệ số tỷ lệ riêng. Có cần thiết phải vậy không?

2/- Cái gía trị tick của bạn dùng để làm gì vậy?

3/- Vì sao bạn phải đánh dấu các điểm trên cá trục tọa độ vậy? Bạn quan tâm tới các điểm nằm trên đồ thị hay tọa độ các điểm?

4/- Trong lisp bạn mới chỉ đánh dấu các điểm thuộc đồ thị bằng lệnh point chứ chưa thấy vẽ lên đồ thị gì cả?

5/- Theo như lisp thì các điểm sẽ được bạn nhập vào theo các tọa độ x, y. Vậy tọa độ này bạn sẽ lầy từ đâu? Hay là cứ nhập tùy ý.

 

Để tạo một list gồm các list tọa độ điểm như bạn mô tả, bạn có thể sử dụng hàm (append......) hoặc hàm (cons......). Cả hai hàm này đều có chức năng gán một list vào một list khác để tạo ra list mới bạn ạ.

Ví dụ trong lisp của bạn, trước khi bạn vào vòng lặp hãy tạo một list rỗng: (setq lstpt (list))

trong vòng lặp, dưới dòng code: Po(vl-list* (* (- ValueX InfX) ScaleX) (* (- ValueY InfY) ScaleY) '(0)) bạn nhập thêm đoạn code sau đây:

lstpt (append lstpt (list Po))

Như vậy cuối vòng lặp bạn sẽ có lstpt là một list gồm tất cả các list tọa độ điểm mà bạn đã nhập ở trên theo trật tự của nó.

Nếu bạn nhập code: lstpt (append (list Po) lstpt) thì list nhận được sẽ có trật tự các điểm bị lộn ngược bạn ạ.

Cũng có thể dùng hàm (cons...) như sau: lstpt (cons lstpt (list Po)) bạn ạ.

 

Chúc bạn vui.

  • 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

Rất cảm ơn bạn đã quan tâm đến Lisp của mình !

Ý tưởng của mình ở đây là vẽ một đồ thị với tỉ lệ hai trục khác nhau, nhưng kich thước đồ thị là định trước.

Các điểm sẽ được tuỳ ý nhập vào, và hơn nữa mình muốn nối một đồ thị gần đúng đi qua các điểm đó.Các giá trị nhập vào là các điểm thực nghiệm , còn đường cong cần vẽ là đường con lý thuyết.

Các dấu tích là để điềm các giá trị ở các trục đồ thị, để người dùng dễ hình dung về các giá trị *(ở đây mình muốn làm như một chương trình graph bình thường)

 

Ngoài ra mình còn muốn tự động viết các giá trị lên đấy nữa.

 

Thực ra , những điều này hoàn toàn có thể làm nhanh gọn với một chương trình graph bình thường.Nhưng xuất phát từ yêu cầu thực tế là mình cần liên kết, so sánh , jóng các já trị của nhiều đồ thị nên mình mới liên hệ đến AutoCAD.

 

Rất mong nhận được ý kiến đóng ghóp của bạ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
Rất cảm ơn bạn đã quan tâm đến Lisp của mình !

Ý tưởng của mình ở đây là vẽ một đồ thị với tỉ lệ hai trục khác nhau, nhưng kich thước đồ thị là định trước.

Các điểm sẽ được tuỳ ý nhập vào, và hơn nữa mình muốn nối một đồ thị gần đúng đi qua các điểm đó.Các giá trị nhập vào là các điểm thực nghiệm , còn đường cong cần vẽ là đường con lý thuyết.

Các dấu tích là để điềm các giá trị ở các trục đồ thị, để người dùng dễ hình dung về các giá trị *(ở đây mình muốn làm như một chương trình graph bình thường)

 

Ngoài ra mình còn muốn tự động viết các giá trị lên đấy nữa.

 

Thực ra , những điều này hoàn toàn có thể làm nhanh gọn với một chương trình graph bình thường.Nhưng xuất phát từ yêu cầu thực tế là mình cần liên kết, so sánh , jóng các já trị của nhiều đồ thị nên mình mới liên hệ đến AutoCAD.

 

Rất mong nhận được ý kiến đóng ghóp của bạn.

Chào bạn Ustoichivost,

Mình không hiểu lắm về chuyên môn của bạn. Nhưng nếu như mình hiểu đúng ý của bạn thì các trục của đồ thị sẽ phải chung một tỉ lệ mới có thể so sánh được đúng không bạn. Và nếu suy luận như vậy thì mình cho rằng cứ làm quách với tỉ lệ 1:1 cho tất cả các trục là OK, tha hồ so sánh mà chả ngại khó khăn gì khi vẽ cả, đồng thời cũng cực tiện cho việc so sánh, đánh giá các đồ thị bạn ạ.

Mặt khác việc bạn hạn chế kích thước của đồ thị có thể dẫn tới hình dáng của đồ thị sẽ không phản ánh đúng cái biến thiên thực của nó, nhất là đối với việc dự đoán dạng đường cong bạn ạ

Với ý định của bạn thì việc bạn viết lisp như vậy mình chưa thấy có gì sai, nhưng chỉ hơi rườm rà.

Việc bạn muốn ghi kích thước lên đồ thị không khó với việc bạn bổ sung thêm các hàm lệnh Text của Cad. Cú pháp của hàm lệnh Text như sau:

(command "text" pt h a text) trong đó pt là điểm đặt text, h là chiều cao của text, a là góc nghiêng của text, còn text là nội dung hay giá trị mà bạn muốn ghi.

Như vậy dòng code này bạn nên thêm vào ngay dưới dòng lệnh xác định tọa độ điểm của bạn, pt bạn nên cho nó một quy luật để gắn tương ứng với vị trí điểm trên các trục tọa độ, h là tùy vào cỡ chữ bạn muốn thể hiện, a có lẽ nên lấy bằng 0, text thì bạn sử dụng hàm car, cadr để lấy giá trị của nó.

Về đường cong lý thuyết, do chưa hiểu về chuyên môn của bạn nên rất khó tham gia ý kiến được, chỉ có thể đoán mò thôi. Cái cách mò của mình như sau: Dùng spline nối các điểm thực nghiệm lại, qua đó dự đoán cái hàm quan hệ giữa y và x (y=f(x) hay x=f(y)). Từ đó xác định các hệ số rồi vẽ thử bạn ạ.

 

Một số góp ý vậy để bạn tham khảo, nếu có gì chưa được mong bạn bỏ quá, nếu có khó khăn trong việc làm lisp, bạn hãy post lên mình sẽ cố thử xem sao.

Chúc bạn vui.

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 những ý kiến đóng ghóp của bạn.

Mình có một thắc mắc như thế này : Nếu như mình không định trước kích thước của đồ thì (độ dài hai trục) mà viết lên các giá trị trên trục số.Sau đó chúng ta in ra với tỉ lệ khác thì phải scale .Như vậy vị trí của các text sẽ bị di dời , không đúng với giá trị nó mang, hoặc đúng nhưng khi đó chiều cao của nó sẽ thay đổi.

Làm sao để giải quyết vấn đề này đâ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
Cảm ơn những ý kiến đóng ghóp của bạn.

Mình có một thắc mắc như thế này : Nếu như mình không định trước kích thước của đồ thì (độ dài hai trục) mà viết lên các giá trị trên trục số.Sau đó chúng ta in ra với tỉ lệ khác thì phải scale .Như vậy vị trí của các text sẽ bị di dời , không đúng với giá trị nó mang, hoặc đúng nhưng khi đó chiều cao của nó sẽ thay đổi.

Làm sao để giải quyết vấn đề này đây ?

Bạn Ustoichivost ơi,

Khi bạn scale cái bản vẽ để in thì bạn chỉ việc chọn tỷ lệ scale và lấy tâm scale là gốc tọa độ thì vị trí các text cũng như cao độ của nó cũng được scale theo đúng với tỷ lệ bạn chọn mà. Do đó khi xem thực tế trên bản in cũng chả khác gì trên bản vẽ đâu bạ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

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
Đăng nhập để thực hiện theo  

×