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.
ssg

Chia đất!!!

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

E load lisp rồi gõ lệnh 'dl' nó toàn báo unknown command là sao ạ. Sao mỗi e bị thế vậy

Hề hề hề,

bạn cần nói rõ là bạn đã load lisp nào, cái thằng dl bạn lấy ở đâu ra??? Chứ bạn hỏi vầy, lisp thì chả thấy sao có thể xác định được lỗi????

Có nhẽ bạn nên post luôn cả cái lisp bạn đã load lên để mọi người có thể check 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

Cái lisp dl.lsp của anh ssg đấy bạn.sao mình down về không dùng được. Bạn còn lisp đấy không up lại hộ mình đc ko. Mình đang cần quá

Hề hề hề,

Có phải bạn cần cái này không nhỉ???

http://www.cadviet.com/upfiles/3/5194_chiadat1.lsp

  • 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

Ðúng rồi anh nhưng sao nó ko có cái bảng này ạ?

 

 

8562_1_6_3.jpg

Hế hề hế,

Muốn có cái bảng này, bạn cần chép thêm file Chiadat.dcl vào trong thư mục có đường dẫn tìm kiếm trong CAD mới được 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

Chương trình do bác Ssg tổng hợp tại #19 đường dẫn đã bị die rồi, ai có cái này up lên lại cho 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

Chào các bạn!

 

Cũng liên quan đến chủ đề này, tôi xin trình bày vấn đề của tôi nhờ mọi người giúp đỡ.

 

Vấn đề như sau:

Tôi có 1 mảnh đất với các cao độ ở các góc đã xác định (text màu tím).

Vẽ 1 đường thẳng bất kỳ làm ranh giới chia đôi khu đất (line màu xanh dương).

 

Bây giờ tôi cần nội suy, dò tìm xác định tất cả các điểm có cao độ đặc biệt nằm trên đường thẳng này (text màu vàng). Chẳng hạn cao độ chẵn 0.05 như ví dụ.

 

Nhờ các bạn xem hộ mình! Cảm ơn.

http://www.cadviet.com/upfiles/5/139246_elv.dwg

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ủ đề này đã từng post trên diễn đàn nhưng đã mất vì có lần host dữ liệu bị sự cố. Nay có yêu cầu tương tự của bạn tuannguyen, ssg xin post lại.

 

Bài toán:

Cho 1 pline kín c và một đường thẳng d cắt c tại ít nhất 2 điểm, chia c thành 2 phần có diện tích S1 và S2.

Xác định vị trí đúng của đường d (không thay đổi phương) sao cho S1/(S1+S2) = k (số k<1 tuỳ ý).

 

Hình minh hoạ:

ChiaDat2.jpg

 

Chương trình lisp, lệnh DL (Divide Land):


;;;===========================================

;;;Chuong trinh chia dien tich pline kin theo ty le va line dinh huong

;;;Copyright by ssg - www.cadviet.com - February 2009

;;;===========================================

 

;;;-------------------------------------------------------------------------------

;;;PUBLIC FUNCTIONS

;;;-------------------------------------------------------------------------------

(defun GetMid (p1 p2)

;;;Midpoint: p1, p2

(polar p1 (angle p1 p2) (/ (distance p1 p2) 2))

)

;;;-------------------------------------------------------------------------------

(defun ints (e1 e2 / ob1 ob2 V L1 L2)

;;;Intersections of e1, e2. Return LIST of points

;;;Thank Mr. Hoanh for this function!

(setq

ob1 (vlax-ename->vla-object e1)

ob2 (vlax-ename->vla-object e2)

)

(setq V (vlax-variant-value (vla-IntersectWith ob1 ob2 acExtendOtherEntity)))

(if (/= (vlax-safearray-get-u-bound V 1) -1)

(progn

(setq L1 (vlax-safearray->list V) L2 nil)

(while L1

(setq L2 (append L2 (list (list (car L1) (cadr L1) (caddr L1)))))

(repeat 3 (setq L1 (cdr L1)))

)

)

(setq L2 nil)

)

L2

)

;;;-------------------------------------------------------------------------------

(defun getVert (e / i L)

;;;Return list of all vertex from pline e

(setq i 0 L nil)

(vl-load-com)

(repeat (fix (+ (vlax-curve-getEndParam e) 1))

(setq L (append L (list (vlax-curve-getPointAtParam e i))))

(setq i (1+ i))

)

L

)

;;;-------------------------------------------------------------------------------

(defun move_slow (e ag dr) ;;;Move e by angle ag, step dr

(command "move" e "" (list 0 0) (polar (list 0 0) ag dr))

)

;;;--------------------------------------------------------------------------------

(defun sideP (p1 p2 e / p1n p2n)

;;;Check same side of 2 points by line e, return T or nil

(command "ucs" "n" "ob" e)

(setq

p1n (trans p1 0 1)

p2n (trans p2 0 1)

)

(command "ucs" "p")

(>= (* (cadr p1n) (cadr p2n)) 0)

)

;;;--------------------------------------------------------------------------------

;;;PRIVATE FUNCTIONS

;;;--------------------------------------------------------------------------------

(defun area_DL (p)

;;;Get area. Specify by e0, e1, p

;;;Filtered vertex, same side with p

(setq Lf (ints e0 e1))

(foreach x L0

(if (sideP x p e1) (setq Lf (append Lf (list x))))

)

;;;Convert to curve-param and sort

(setq Lpara nil)

(foreach x Lf

(setq para (vlax-curve-getParamAtPoint e0 x))

(setq Lpara (append Lpara (list para)))

)

(setq Lpara (vl-sort Lpara '<))

;;;Get area

(command ".area")

(foreach x Lpara (command (vlax-curve-getPointAtParam e0 x)))

(command "")

(setq S (getvar "area"))

)

;;;--------------------------------------------------------------------------------

(defun data_DL ()

;;;Input data and calculate

(vl-load-com)

(setq e0 (car (entsel "\nChon 1 pline kin:")))

(redraw e0 3)

(setq

e1 (car (entsel "\nChon duong chia (cat pline it nhat tai 2 diem):"))

Li (ints e0 e1)

)

(redraw e1 3)

(if (< (length Li) 2) (progn (alert "\nKhong tim thay 2 giao diem!") (exit)))

(setq

i (- (length Li) 1)

di (distance (car Li) (nth i Li))

p0 (getpoint "\nPick 1 diem ben trong pline:")

k (getreal "\nTy le phan chia tuong ung voi diem pick <0.5>:")

)

(if (not k) (setq k 0.5))

(setq

S0 (vlax-curve-getArea e0)

S1 (* k S0)

L0 (getVert e0) ;;;List of all vertex

S00 (area_DL p0)

St S00

p1 (vlax-curve-getClosestPointTo e1 p0)

ag (angle p1 p0)

prec 0.00000001

oldos (getvar "osmode")

)

(cond

((<= (abs (- S00 S1)) prec) (progn (alert "Duong chia dang nam dung vi tri!") (command "regen") (exit)))

((> S00 S1) (setq flag 1))

((< S00 S1) (setq flag -1))

)

(setvar "cmdecho" 0)

(setvar "osmode" 0)

)

;;;--------------------------------------------------------------------------------

(defun RunDL ()

(setq OK nil)

(while (not OK)

(setq

Li (ints e0 e1)

i (- (length Li) 1)

pM (getMid (car Li) (nth i Li))

pN (polar pM ag tol)

St (area_DL pN)

)

(if (<= (* St flag) (* S1 flag))

(progn (setq flag (* flag -1)) (setq OK T))

(move_slow e1 ag (* flag tol))

)

)

)

;;;============================================

;;;MAIN

;;;============================================

;;;Divide Land

(defun C:DL (/ e0 e1 Li i di p0 k tol s0 s1 p1 ag L0 OK Lf x

p Lpara para S oldos S00 flag pM pN St prec)

(prompt "Chuong trinh chia dien tich pline kin theo ty le va line dinh huong")

(data_DL)

(alert "Bam OK, duong chia se di chuyen va dao dong\nCu yen chi cho mot chut!")

(setq tol (* di 0.01))

(while (> (abs (- St S1)) prec) (runDL) (setq tol (* 0.1 tol)))

(alert "FINISH!")

(setvar "cmdecho" 1)

(setvar "osmode" oldos)

(command "regen")

(princ)

)

;;;============================================

 

Diễn giải:

Chọn pline kín c, chọn line d, pick 1 điểm bên trong pline, nhập hệ số tỷ lệ k tương ứng với "phần đất" tại điểm pick. Chương trình sẽ di chuyển đường d đến vị trí gần đúng, dao động quanh vị trí đúng và dừng lại khi đạt độ chính xác đến 8 chữ số thập phân.

Dùng cái này để chia đất... "từ đường hương hoả" bảo đảm công bằng, khỏi phải kình cãi làm anh chị em mất đoàn kết!

 

Các bạn đừng "kênh" nhau nữa! Dĩ hoà vi quý!

Ssg đã hoàn thiện chương trình tổng hợp, hy vọng làm hài lòng tất cả các bạn:

 

http://www.cadviet.com/upfiles/ChiaDat.zip

 

Minh hoạ:

ChiaDat3.jpg

 

Các bạn dùng thử, phát hiện sai sót và phản hồi, ssg sẽ sửa.

 

@tuannguyen:

Anh diễn giải rõ ý hơn, ssg sẽ xem và lập trình giúp anh. Trước hết, anh post cho ssg cái bảng toạ độ bằng Excel (để khỏi phải gõ lại).

 

Ssg có mấy ý này:

 

1. Đúng theo bản vẽ nguyên thuỷ của anh, diện tích hợp bởi y=18, đáy và 2 đường spline mạn thuyền là 915.6771. Anh kiểm tra lại trên bản vẽ đã post sẽ thấy.

 

2. Khi dùng C2P, đường spline biến thành pline với nhiều đoạn thẳng nhỏ nối tiếp nhau nên buộc phải có sai số. Anh muốn giảm sai số thì khi chương trình hỏi "Length of 1 segment <0.5>:", anh nhập giá trị nhỏ tuỳ ý (trị số 0.5 trong dấu móc nhọn là mặc định của chương trình, nếu chấp nhận chỉ cần Enter mà không phải nhập số). Cái giá phải trả cho việc nâng độ chính xác là pline nhiều segments hơn, chương trình chạy lâu hơn (kể cả khi chạy lisp DL sau này). User phải tự cân nhắc giữa độ chính xác và thời gian xử lý để chọn "Length of 1 segments" hợp lý.

 

3. Các sai số trên, tính theo tương đối là rất nhỏ. Mọi yêu cầu kỹ thuật thông thường của ngành cơ khí cũng như của tàu bè, theo ssg là quá nhỏ, hoàn toàn yên tâm. Hơn nữa, đường spline anh dựng cũng dựa trên cơ sở một tập hợp rời rạc các điểm (với số lượng các điểm như ssg thấy trong bản vẽ là rất ít) -> bản thân nó đã bao hàm sai số khá lớn, không như đường cong toán học lý tưởng. Nếu anh thấy cần, hôm nào ssg sẽ làm cho anh cái lisp vẽ đồ thị từ phương trình toán học, vẽ thẳng ra pline luôn, khỏi phải dùng C2P.

bác có thể cho e xin cái lisp như trong link này được ko bác e đang cần 

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

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


×