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

Chia đất!!!

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

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!

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.

...

 

Từ giải thuật trên, anh ssg có thể biến đổi để: chia một đa giác thành hai phần theo đường ranh giới đi qua một đỉnh (đường thẳng d sẽ xuất phát từ một đỉnh của pline kín c, điểm còn lại của đường thẳng d sẽ cắt cạnh đối diện với đỉnh. Khi chạy chương trình, đường thẳng d xoay quanh đỉnh này, khi nào đạt giá trị diện tích theo yêu cầu thì dừng) chân thành cảm ơn anh

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ừ giải thuật trên, anh ssg có thể biến đổi để: chia một đa giác thành hai phần theo đường ranh giới đi qua một đỉnh (đường thẳng d sẽ xuất phát từ một đỉnh của pline kín c, điểm còn lại của đường thẳng d sẽ cắt cạnh đối diện với đỉnh. Khi chạy chương trình, đường thẳng d xoay quanh đỉnh này, khi nào đạt giá trị diện tích theo yêu cầu thì dừng) chân thành cảm ơn anh

Chương trình đã sửa theo ý anh vbao. User chỉ định thêm điểm cố định, đường chia d sẽ quay quanh điểm này.

 

;;;===========================================
;;;Chuong trinh chia dien tich pline kin theo ty le va line xuat phat tu 1 dinh
;;;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 rota_slow (e ag dr) 
;;;    (command "move" e "" (list 0 0) (polar (list 0 0) ag dr))
(if (> dr 0)
   (command "rotate" e "" pc "r" pC pM pN)
   (command "rotate" e "" pc "r" pC pN pM)
)
)
;;;--------------------------------------------------------------------------------
(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 di qua 1 dinh pline va cat pline tai 1 diem khac:"))
   Li (ints e0 e1)
)
(redraw e1 3)
(if (< (length Li) 2) (progn (alert "\nKhong tim thay 2 giao diem!") (exit)))
(setq
   pc (getpoint "\nChon diem co dinh:")
   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))
        (rota_slow e1 ag (* flag tol))
   )
)
)
;;;============================================
;;;MAIN
;;;============================================
;;;Divide Land
(defun C:DL1 (/ 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 xuat phat tu 1 dinh")
(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)
)
;;;============================================

 

Ssg chưa test kỹ lắm. Các bạn dùng thử trong nhiều trường hợp xem có sai sót gì không. Tạm thời dùng lệnh DL1. Khi nào ổn ssg sẽ gộp 2 chương trình thành 1, kèm theo option cho user.

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.

 

 

Có một hình phẳng được biểu diễn bằng 2 hàm sau:

1/x=409.0391*y^0.172378-77.3889*y^(2*0.172378) trong đó y=0 ÷ 23.5

2/x=-694607*y^-0.115636+1.09*y^(2*-0.115636) trong đó y=23.5÷ 33.9248

Sử dụng tính đối xứng qua trục Oy ta được hình như sau:

http://www.cadviet.com/upfiles/TinhDT159.dwg

Đường thẳng có hàm y=23.5 cắt hình cong phẳng có diện tích phần dưới là 916.0026 sau đó cho đường thẳng này nghiêng theo góc α = 10độ÷90độ nhưng diện tích vẫn là 916.0026 ( như hình vẽ TinhDT159.dwg). Nhờ Bác ssg viết lisp dùm vì làm thủ công rất lâu nhưng độ chính xác vẫn không bảo đảm.

Mình không hiểu gì về lisp nhưng hiện nay mình chưa có thời gian nghiên cứu mong bác thông cả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

Ồ lần đầu tiên elleHCSC mới nhìn thấy nó chạy đấy, lạ mắt quá...kết quả chính xác rồi ssg ah, chỉ có điều ssg đặt prec = 0.00000001 thì nó chạy lâu quá. Trong thực tế đo đạc bản đồ giải thửa này thì độ chính xác của các điểm mia (toạ độ) hoặc chiều dài cạnh người ta chỉ lấy đến 0.001 (m) thôi, đối với diện tích thì lấy đến 0.01 (m2). Có lẽ chỉ cần để 0.001 hoặc 0.0001 là quá đủ cho việc chia thửa này rồ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
Ồ lần đầu tiên elleHCSC mới nhìn thấy nó chạy đấy, lạ mắt quá...kết quả chính xác rồi ssg ah, chỉ có điều ssg đặt prec = 0.00000001 thì nó chạy lâu quá. Trong thực tế đo đạc bản đồ giải thửa này thì độ chính xác của các điểm mia (toạ độ) hoặc chiều dài cạnh người ta chỉ lấy đến 0.001 (m) thôi, đối với diện tích thì lấy đến 0.01 (m2). Có lẽ chỉ cần để 0.001 hoặc 0.0001 là quá đủ cho việc chia thửa này rồi.

Bác ssg là dân cơ khí nên độ chính xác cũng là của dân cơ khí ^_^ Bọn em dân công trình thì độ chính xác chỉ đến tầm mm là xuýt xoa lắm rồi. Một lần nữa cám ơn bác ssg về bài toán nà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ột hình phẳng được biểu diễn bằng 2 hàm sau:

1/x=409.0391*y^0.172378-77.3889*y^(2*0.172378) trong đó y=0 ÷ 23.5

2/x=-694607*y^-0.115636+1.09*y^(2*-0.115636) trong đó y=23.5÷ 33.9248

Sử dụng tính đối xứng qua trục Oy ta được hình như sau:

http://www.cadviet.com/upfiles/TinhDT159.dwg

Đường thẳng có hàm y=23.5 cắt hình cong phẳng có diện tích phần dưới là 916.0026 sau đó cho đường thẳng này nghiêng theo góc α = 10độ÷90độ nhưng diện tích vẫn là 916.0026 ( như hình vẽ TinhDT159.dwg). Nhờ Bác ssg viết lisp dùm vì làm thủ công rất lâu nhưng độ chính xác vẫn không bảo đảm.

Mình không hiểu gì về lisp nhưng hiện nay mình chưa có thời gian nghiên cứu mong bác thông cảm.

Bài toán của anh có thể giải quyết bằng lisp "chia đất" này. Trình tự thực hiện như sau, tham khảo file ssg đã chạy ví dụ:

 

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

 

1. Là hình nguyên thuỷ theo bản vẽ của anh

 

2. Copy 1/2 hình, dùng lisp ConvertToPline (cái này ssg đã post ở đâu đó rồi, tiện thể post lại ở đây), lệnh C2P. Khi chương trình hỏi "Delete source object? Y/N" thì chọn "Y", xoá luôn cái spline cho đỡ lằng nhằng!

;;;***********************************************************
;;;CONVERT TO PLINES PROGRAM WITH FULL COMMENTS!
;;;Convert all objects: Line, Pline, Spline, Arc, Circle, Ellipse_
;;;to Plines. Length of 1 segment is specified by user
;;;Copy & Paste to Notepad, Saveas *.lsp, Appload then Type C2P to run
;;;Happy New Year 2008!
;;;Written by ssg - January 2008 - www.cadviet.com 
;;;***********************************************************

;;;-------------------------------------------------------------
(defun makepl ( e d1 / ps pe d d2 p2) ;;;Make pline along curve e. Length of 1 segment = d1
(vl-load-com) ;;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
   ps (vlax-curve-getStartPoint e) ;;;Start point
   pe (vlax-curve-getEndPoint e) ;;;End point
   d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)) ;;;Length of curve e
   d2 d1 ;;;Init variable distance
)
(command "pline") ;;;Call pline command
(command ps) ;;;Start point
(while (<= d2 d) ;;;While not over end point pe
   (setq p2 (vlax-curve-getPointAtDist e d2)) ;;;Variable point at d2 = length along curve
   (command p2) ;;;Continue pline command from current point to p2
   (setq d2 (+ d2 d1)) ;;;Increase distance d2 by d1
) ;;;End while
(command pe "") ;;;Pline to pe and finish command
)
;;;-------------------------------------------------------------
(defun C:C2P( / d1 ss oldos i e ans) ;;;Convert to Plines
(if (not d0) (setq d0 0.5)) ;;;Init dividual distance, global variable
(setq d1 (getreal (strcat "\nLength of 1 segment <" (rtos d0) ">:"))) ;;;Input distance
(if d1 (setq d0 d1) (setq d1 d0)) ;;;Reset or get distance
(setq
   ss (ssget '((0 . "LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))) ;;;Selection set
   oldos (getvar "osmode") ;;;Save osmode
   i 0 ;;;Init counter
)
(setvar "osmode" 0) ;;;Disable osmode
(repeat (sslength ss) ;;;Repeat for all entities in ss
   (setq e (ssname ss i)) ;;;Set e for entity with ordinal i in selection set ss
   (makepl e d1) ;;;Use makepl function. Make pline along e
   (setq i (1+ i)) ;;;Increase counter
)
(initget "Y N") ;;;Init keywords
(setq ans (getkword "\nDelete source objects? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") (command "erase" ss "")) ;;;Erase source objects if ans = "y" or "Y"
(setvar "osmode" oldos) ;;;Reset osmode
(princ) ;;;Silent quit
)
;;;-------------------------------------------------------------

Thực hiện lần lượt cho 2 spline. Kết quả: 2 đường spline biến thành 2 pline riêng biệt

 

3. Lấy đối xứng, gọi lệnh Pedit với tuỳ chọn j (joint) -> toàn bộ thành 1 pline khép kín duy nhất. Tính được:

- Diện tích toàn phần S = 1286.9223

- Diện tích giới hạn bởi đường y=18 (không phải y=23.5 như anh đã nêu, có lẽ nhầm?): S1 = 915.9525

- Hệ số k = S1/S = 0.711739

 

4. Vẽ 1 line có góc nghiêng tuỳ ý, cắt pline kín ở 2 điểm, dùng cái lisp "chia đất" (lisp đầu tiên của topic này), chạy lệnh DL.

Đường chia dừng lại ở vị trí có S1 = 915.9528 -> sai số rất nhỏ so với các tính toán kỹ thuật thông thường

 

Tương tự như vậy, anh có thể thực hiện với nhiều đường chia có góc nghiêng theo ý muố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
Bài toán của anh có thể giải quyết bằng lisp "chia đất" này. Trình tự thực hiện như sau, tham khảo file ssg đã chạy ví dụ:

 

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

 

1. Là hình nguyên thuỷ theo bản vẽ của anh

 

2. Copy 1/2 hình, dùng lisp ConvertToPline (cái này ssg đã post ở đâu đó rồi, tiện thể post lại ở đây), lệnh C2P. Khi chương trình hỏi "Delete source object? Y/N" thì chọn "Y", xoá luôn cái spline cho đỡ lằng nhằng!

;;;***********************************************************
;;;CONVERT TO PLINES PROGRAM WITH FULL COMMENTS!
;;;Convert all objects: Line, Pline, Spline, Arc, Circle, Ellipse_
;;;to Plines. Length of 1 segment is specified by user
;;;Copy & Paste to Notepad, Saveas *.lsp, Appload then Type C2P to run
;;;Happy New Year 2008!
;;;Written by ssg - January 2008 - www.cadviet.com 
;;;***********************************************************

;;;-------------------------------------------------------------
(defun makepl ( e d1 / ps pe d d2 p2) ;;;Make pline along curve e. Length of 1 segment = d1
(vl-load-com) ;;;Load Visual LISP extensions before use vlax-xxxx functions
(setq
   ps (vlax-curve-getStartPoint e) ;;;Start point
   pe (vlax-curve-getEndPoint e) ;;;End point
   d (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e)) ;;;Length of curve e
   d2 d1 ;;;Init variable distance
)
(command "pline") ;;;Call pline command
(command ps) ;;;Start point
(while (<= d2 d) ;;;While not over end point pe
   (setq p2 (vlax-curve-getPointAtDist e d2)) ;;;Variable point at d2 = length along curve
   (command p2) ;;;Continue pline command from current point to p2
   (setq d2 (+ d2 d1)) ;;;Increase distance d2 by d1
) ;;;End while
(command pe "") ;;;Pline to pe and finish command
)
;;;-------------------------------------------------------------
(defun C:C2P( / d1 ss oldos i e ans) ;;;Convert to Plines
(if (not d0) (setq d0 0.5)) ;;;Init dividual distance, global variable
(setq d1 (getreal (strcat "\nLength of 1 segment <" (rtos d0) ">:"))) ;;;Input distance
(if d1 (setq d0 d1) (setq d1 d0)) ;;;Reset or get distance
(setq
   ss (ssget '((0 . "LINE,LWPOLYLINE,SPLINE,ARC,CIRCLE,ELLIPSE"))) ;;;Selection set
   oldos (getvar "osmode") ;;;Save osmode
   i 0 ;;;Init counter
)
(setvar "osmode" 0) ;;;Disable osmode
(repeat (sslength ss) ;;;Repeat for all entities in ss
   (setq e (ssname ss i)) ;;;Set e for entity with ordinal i in selection set ss
   (makepl e d1) ;;;Use makepl function. Make pline along e
   (setq i (1+ i)) ;;;Increase counter
)
(initget "Y N") ;;;Init keywords
(setq ans (getkword "\nDelete source objects? [Yes/No] :")) ;;;Get answer from user
(if (= ans "Y") (command "erase" ss "")) ;;;Erase source objects if ans = "y" or "Y"
(setvar "osmode" oldos) ;;;Reset osmode
(princ) ;;;Silent quit
)
;;;-------------------------------------------------------------

Thực hiện lần lượt cho 2 spline. Kết quả: 2 đường spline biến thành 2 pline riêng biệt

 

3. Lấy đối xứng, gọi lệnh Pedit với tuỳ chọn j (joint) -> toàn bộ thành 1 pline khép kín duy nhất. Tính được:

- Diện tích toàn phần S = 1286.9223

- Diện tích giới hạn bởi đường y=18 (không phải y=23.5 như anh đã nêu, có lẽ nhầm?): S1 = 915.9525

- Hệ số k = S1/S = 0.711739

 

4. Vẽ 1 line có góc nghiêng tuỳ ý, cắt pline kín ở 2 điểm, dùng cái lisp "chia đất" (lisp đầu tiên của topic này), chạy lệnh DL.

Đường chia dừng lại ở vị trí có S1 = 915.9528 -> sai số rất nhỏ so với các tính toán kỹ thuật thông thường

 

Tương tự như vậy, anh có thể thực hiện với nhiều đường chia có góc nghiêng theo ý muốn.

Đúng là y=18 (mớn nước)chứ không phải y=23.5 (mép boong). nhưng S1=916.0026 chứ không phải là 915.9528 ssg xem lại giúp mình. 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
Đúng là y=18 (mớn nước)chứ không phải y=23.5 (mép boong). nhưng S1=916.0026 chứ không phải là 915.9528 ssg xem lại giúp mình. Cảm ơn

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.

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 đã sửa theo ý anh vbao. User chỉ định thêm điểm cố định, đường chia d sẽ quay quanh điểm này.

 

Ssg chưa test kỹ lắm. Các bạn dùng thử trong nhiều trường hợp xem có sai sót gì không. Tạm thời dùng lệnh DL1. Khi nào ổn ssg sẽ gộp 2 chương trình thành 1, kèm theo option cho user.

Tuyệt! SSg hãy gộp 2 cái lại cho tiện, nếu cần đưa luôn option về độ chính xác cho user

Thanks SSg

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

Mình đã kiểm tra lại bản vẽ nguyên thủy S1= 916.0026 nhưng kiểm tra bản vẽ ssg thì không sử dụng được lệnh massprop, ssg chỉ giúp mình nhé, và nếu có thời gian ssg vẽ theo hàm, chứ không là những điểm rời rạc.

http://www.cadviet.com/upfiles/TinhDT159B.dwg

Command: _massprop

Select objects: 1 found

 

Select objects:

 

---------------- REGIONS ----------------

 

Area: 916.0026

Perimeter: 134.5364

Bounding box: X: 18.0919 -- 72.1293

Y: 77.1791 -- 95.1791

Centroid: X: 45.1106

Y: 86.5317

Moments of inertia: X: 6882551.6703

Y: 2065406.5843

Product of inertia: XY: 3575614.3703

Radii of gyration: X: 86.6815

Y: 47.4848

Principal moments and X-Y directions about centroid:

I: 23764.3487 along [1.0000 0.0000]

J: 201371.8030 along [0.0000 1.0000]

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

Mình nhờ các Anh giúp cho 1 lisp để chia diện tích :

Có một hình đa giác mất kỳ, yêu cầu tính diện tích theo số diện tích cho trước, vẽ hướng chia là theo hướng dự kiến chia.

Chương trình sẻ tính theo số diện tích đó và thể hiện đường line, ghi diện tích chia phần mới và phầm còn lại.

Rất mong đựoc các anh giúp.

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 đã kiểm tra lại bản vẽ nguyên thủy S1= 916.0026 nhưng kiểm tra bản vẽ ssg thì không sử dụng được lệnh massprop, ssg chỉ giúp mình nhé, và nếu có thời gian ssg vẽ theo hàm, chứ không là những điểm rời rạc.

http://www.cadviet.com/upfiles/TinhDT159B.dwg

Command: _massprop

Select objects: 1 found

 

Select objects:

 

---------------- REGIONS ----------------

 

Area: 916.0026

Perimeter: 134.5364

Bounding box: X: 18.0919 -- 72.1293

Y: 77.1791 -- 95.1791

Centroid: X: 45.1106

Y: 86.5317

Moments of inertia: X: 6882551.6703

Y: 2065406.5843

Product of inertia: XY: 3575614.3703

Radii of gyration: X: 86.6815

Y: 47.4848

Principal moments and X-Y directions about centroid:

I: 23764.3487 along [1.0000 0.0000]

J: 201371.8030 along [0.0000 1.0000]

Cảm ơn ssg rất nhiều.

1. Lệnh massprop chỉ tác dụng với region hoặc 3dsolid. Trong bản vẽ của ssg, chỉ có pline kín. Muốn biết diện tích, anh bấm chọn nó, gõ MO sẽ thấy area.

 

2. Dù có "vẽ theo hàm", kết quả cũng là một tập hợp rời rạc các điểm. Cái khác nhau giữa làm thủ công và dùng chương trình là anh có thể chọn số điểm lớn tuỳ ý (nhờ tốc độ xử lý nhanh) -> độ chính xác tăng lên (cũng có thể tuỳ ý) nhưng không bao giờ đạt được "độ chính xác tuyệt đối" như trong toán học lý thuyết. Ngay cả các đối tượng AutoCAD vẫn là một tập rời rạc các điểm. AutoCAD, hay bất kỳ trình CAD nào khác, cũng chỉ xử lý đến một độ chính xác nào đó theo khả năng cũng như mức độ chấp nhận được của kỹ thuật thôi.

 

3. Các hệ số hoặc số mũ trong 2 phương trình anh nêu lên không đúng theo hình biên dạng tàu trong bản vẽ anh đã post. Anh thử thay số y=23.5 vào phương trình đầu xem, kết quả nhận được là 475.xxxx chứ không phải là 27 như trên bản vẽ.

 

4. Cả 2 phương trình của anh đều có một dạng tổng quát:

 

X = k1.Ym + k2.Y2m

 

với k1, k2, m có thể >0 hoặc <0

 

Anh dùng lisp sau để vẽ đồ thị dạng trên, lệnh BDT (biên dạng tàu):

;;;-------------------------------------------------------
(defun ShipProfile(k1 k2 m y1 y2 n)
(setq y y1 dy (/ (- y2 y1) n))
(command "pline")
(while (<= y y2)
   (setq x (+ (* k1 (expt y m)) (* k2 (expt y (* 2 m)))))
   (command (list x y))
   (setq y (+ y dy))
)
(command "")
)
;;;-------------------------------------------------------
(defun C:BDT( / k1 k2 m y1 y2 n oldos)
;;;Ve bien dang tau theo pt: x = k1*y^m + k2*y^2*m
(if (not n0) (setq n0 100))
(setq
   k1 (getreal "\nHe so thu 1:")
   k2 (getreal "\nHe so thu 2:")
   m (getreal "\nSo mu:")
   y1 (getreal "\nGia tri Ymin:")
   y2 (getreal "\nGia tri Ymax:")
   n (getint (strcat "\nSo doan chia <" (itoa n0) ">:"))
   oldos (getvar "osmode")
)
(if (not n) (setq n n0) (setq n0 n))
(setvar "osmode" 0)
(ShipProfile k1 k2 m y1 y2 n)
(setvar "osmode" oldos)
(princ)
)
;;;-------------------------------------------------------

 

Chương trình yêu cầu nhập các hệ số và số mũ, giá trị Ymin, Ymax và số đoạn chia. Mặc định số đoạn chia ban đầu là 100 trong dấu móc nhọn (nếu chấp nhận chỉ Enter không cần nhập số). Giá trị số đoạn chia của lần chạy trước sẽ tự nhớ cho các lần chạy sau. Anh muốn tăng độ chính xác thì tăng số đoạn chia lên. Cái giá phải trả như ssg đã nói ở bài trướ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
Mình nhờ các Anh giúp cho 1 lisp để chia diện tích :

Có một hình đa giác mất kỳ, yêu cầu tính diện tích theo số diện tích cho trước, vẽ hướng chia là theo hướng dự kiến chia.

Chương trình sẻ tính theo số diện tích đó và thể hiện đường line, ghi diện tích chia phần mới và phầm còn lại.

Rất mong đựoc các anh giúp.

Ssg ghi nhận ý của bạn, sẽ hoàn thiện chương trình "chia đất", chính xác hơn là "chia diện tích" với nhiều mục đích sử dụng và tuỳ chọn khác nhau của user. Các yêu cầu của bạn có thể sẽ được đáp ứng phần nào đó, phù hợp với "cái nền" của một chương trình chung. Phần nào chưa được đáp ứng, bạn vui lòng tự làm tiếp.

Hẹn các bạn vài hôm nữa sẽ có chương trình tổng hợp.

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 nhờ các Anh giúp cho 1 lisp để chia diện tích :

Có một hình đa giác mất kỳ, yêu cầu tính diện tích theo số diện tích cho trước, vẽ hướng chia là theo hướng dự kiến chia.

Chương trình sẻ tính theo số diện tích đó và thể hiện đường line, ghi diện tích chia phần mới và phầm còn lại.

Rất mong đựoc các anh giúp.

 

ssg đã ghi rõ cái công thức rồi mà : S1/(S1+S2) = K

 

(S1+S2) là diện tích tổng của thửa đất bạn đã biết

S1 là diện tích bạn cần chia => bạn cũng biết

 

vậy thì bạn muốn chia cái thửa thành 2 phần mà phần S1 bạn đã biết thì việc còn lại của bạn là tính cái hệ số K là bao nhiêu rồi nhập nó vào dòng lệnh thì CT nó cho bạn kết quả rồi ????!

 

Không hiểu bạn có biết tính toán ko nữa, CT đã thoả mãn đầu bài của bạn rồi còn gì...

 

Đọc kỹ hướng dẫn trước khi sử dụ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
ssg đã ghi rõ cái công thức rồi mà : S1/(S1+S2) = K

 

(S1+S2) là diện tích tổng của thửa đất bạn đã biết

S1 là diện tích bạn cần chia => bạn cũng biết

 

vậy thì bạn muốn chia cái thửa thành 2 phần mà phần S1 bạn đã biết thì việc còn lại của bạn là tính cái hệ số K là bao nhiêu rồi nhập nó vào dòng lệnh thì CT nó cho bạn kết quả rồi ????!

 

Không hiểu bạn có biết tính toán ko nữa, CT đã thoả mãn đầu bài của bạn rồi còn gì...

 

Đọc kỹ hướng dẫn trước khi sử dụng

Mình cũng cố gắng đánh vần để hiểu đó bạn

Ý mình muốn việc chia được cụ thể hơn mà thôi :

Nếu có một hình đa giác bất kỳ ví dụ có diện tích là 1.023 m2, mà diện cích cần tách ra là 155m2, theo một hướng chia được thống nhất theo một chiều nào đó, từ tây qua đông , bắc xuống nam hay ngược lại.

Chương trình sẻ tính đúng và vẽ đường line của phần phân chia mới đó,

Vậy Bạn có hiểu ý không ? Ở đây không cần tính K.

yên cầu chương trình :

1. Chọn đa tuyến

2. Nhập diện tích cần chia

3. Chọn hướng chia cắt ngang qua hình dáng đa tuyến đó và là phạm vi đề vẽ đưởng line phân cách theo diện tích qui định

Đọc kỹ Yêu cầu trước khi Làm bà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
Mình cũng cố gắng đánh vần để hiểu đó bạn

Ý mình muốn việc chia được cụ thể hơn mà thôi :

Nếu có một hình đa giác bất kỳ ví dụ có diện tích là 1.023 m2, mà diện cích cần tách ra là 155m2, theo một hướng chia được thống nhất theo một chiều nào đó, từ tây qua đông , bắc xuống nam hay ngược lại.

Chương trình sẻ tính đúng và vẽ đường line của phần phân chia mới đó,

Vậy Bạn có hiểu ý không ? Ở đây không cần tính K.

yên cầu chương trình :

1. Chọn đa tuyến

2. Nhập diện tích cần chia

3. Chọn hướng chia cắt ngang qua hình dáng đa tuyến đó và là phạm vi đề vẽ đưởng line phân cách theo diện tích qui định

Đọc kỹ Yêu cầu trước khi Làm bài

 

Không hiểu ý bạn cần chia như thế nào lắm...

 

một hình đa giác bất kỳ : CT này chạy nó hỏi chọn một Pline kín (có nghĩa là 1 đa giác bất kỳ rồi)

 

diện tích là 1.023 m2 : CT chạy nó tự tính diện tích của đa giác này (S1+S2)

 

diện cích cần tách ra là 155m2 nghĩa là S1=155 m2; K = 155/1.023 ra kq là : 0.15151515151515151515151515151515 thì bạn nhập cái số này vào dòng lệnh chạy của CT (biến báo 1 tý đi chứ), pick 1 phát vào vùng cần tách (S1) chắc chắn sau khi chạy nó move cái line về vị trí thoả mãn diện tích là 155 m2 (diện tích S1)

 

theo một hướng chia được thống nhất theo một chiều nào đó, từ tây qua đông , bắc xuống nam hay ngược lại

cái này thì trước khi chạy user phải xác định và vẽ 1 đường cắt qua thửa. Muốn chia từ tây sang đông thì vẽ 1 line theo chiều từ bắc nam (nam bắc), muốn chia từ hướng bắc nam thì vẽ 1 line theo chiều đông tây (tây đông) thôi. CT sẽ "lôi" cái line bạn vẽ song song với line gốc mà...

 

 

Muốn minh họa chính xác thì hãy up cái file dwg của bạn định chia lên cho pakon xem cho nó rõ hơn hoặc make 1 đoạn video mô tả lại cái cách bạn chia thì mới tỏ được chứ đưa lên 1 yêu cầu "Đọc kỹ yêu cầu trước khi làm bài" thì chắc chả ai dám xung phong hỗ trợ bạn đâu, đó là câu nói của thày giáo dặn học sinh rồ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
1. Lệnh massprop chỉ tác dụng với region hoặc 3dsolid. Trong bản vẽ của ssg, chỉ có pline kín. Muốn biết diện tích, anh bấm chọn nó, gõ MO sẽ thấy area.

 

2. Dù có "vẽ theo hàm", kết quả cũng là một tập hợp rời rạc các điểm. Cái khác nhau giữa làm thủ công và dùng chương trình là anh có thể chọn số điểm lớn tuỳ ý (nhờ tốc độ xử lý nhanh) -> độ chính xác tăng lên (cũng có thể tuỳ ý) nhưng không bao giờ đạt được "độ chính xác tuyệt đối" như trong toán học lý thuyết. Ngay cả các đối tượng AutoCAD vẫn là một tập rời rạc các điểm. AutoCAD, hay bất kỳ trình CAD nào khác, cũng chỉ xử lý đến một độ chính xác nào đó theo khả năng cũng như mức độ chấp nhận được của kỹ thuật thôi.

 

3. Các hệ số hoặc số mũ trong 2 phương trình anh nêu lên không đúng theo hình biên dạng tàu trong bản vẽ anh đã post. Anh thử thay số y=23.5 vào phương trình đầu xem, kết quả nhận được là 475.xxxx chứ không phải là 27 như trên bản vẽ.

 

4. Cả 2 phương trình của anh đều có một dạng tổng quát:

 

X = k1.Ym + k2.Y2m

 

với k1, k2, m có thể >0 hoặc <0

 

Anh dùng lisp sau để vẽ đồ thị dạng trên, lệnh BDT (biên dạng tàu):

;;;-------------------------------------------------------
(defun ShipProfile(k1 k2 m y1 y2 n)
(setq y y1 dy (/ (- y2 y1) n))
(command "pline")
(while (<= y y2)
   (setq x (+ (* k1 (expt y m)) (* k2 (expt y (* 2 m)))))
   (command (list x y))
   (setq y (+ y dy))
)
(command "")
)
;;;-------------------------------------------------------
(defun C:BDT( / k1 k2 m y1 y2 n oldos)
;;;Ve bien dang tau theo pt: x = k1*y^m + k2*y^2*m
(if (not n0) (setq n0 100))
(setq
   k1 (getreal "\nHe so thu 1:")
   k2 (getreal "\nHe so thu 2:")
   m (getreal "\nSo mu:")
   y1 (getreal "\nGia tri Ymin:")
   y2 (getreal "\nGia tri Ymax:")
   n (getint (strcat "\nSo doan chia <" (itoa n0) ">:"))
   oldos (getvar "osmode")
)
(if (not n) (setq n n0) (setq n0 n))
(setvar "osmode" 0)
(ShipProfile k1 k2 m y1 y2 n)
(setvar "osmode" oldos)
(princ)
)
;;;-------------------------------------------------------

 

Chương trình yêu cầu nhập các hệ số và số mũ, giá trị Ymin, Ymax và số đoạn chia. Mặc định số đoạn chia ban đầu là 100 trong dấu móc nhọn (nếu chấp nhận chỉ Enter không cần nhập số). Giá trị số đoạn chia của lần chạy trước sẽ tự nhớ cho các lần chạy sau. Anh muốn tăng độ chính xác thì tăng số đoạn chia lên. Cái giá phải trả như ssg đã nói ở bài trước.

Rất cảm ơn,

-Mình đã học được thêm lệnh MO để tìm diện tích và một số lisp mình đang rất cần.

-Tất cả là tương đối theo lý thuyết Albert Einstein, và mình cũng không tham vọng gì lớn nhưng mình muốn tăng độ chính xác cao nhất có thể trong thiết kế mà khi trình làng một vấn đề nào đó theo một hướng nào đó mọi người chấp nhận được tất nhiên là trên cơ sở kỹ thuật chính thống. Về lý thuyết toán học chúng cũng tiếp tục phát triển nó cũng là tương đối cả thôi

-Đúng như ssg biểu diễn hàm, nhưng khi vẽ mình có một số điểm chế lại. Riêng về điểm y=23.5 vào phương trình vẫn là kết quả 54... là cả một chiều ngang mạng tàu và sau đó mình chia cho 2 là 27...là 1 nữa mạng tàu mà mình chưa trình bày rõ với ssg chứ không phải kết quả nhận được là 475.xxxx.

Cảm ơn ssg nhiều nhiều.

À mình muốn hỏi thêm ssg có thể giúp lập trình khi nhập các toạ độ thì có thể vẽ ra một chiếc tàu theo 2D hoặc 3D như sau không?:(tất nhiên việc này mình với ssg còn phải trao đổi nhiều).

http://www.cadviet.com/upfiles/NT06_5.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

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

  • Vote tăng 5

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 Bạn đã quan tâm giúp đỡ cho các anh em.

Chương trình rất tuyệt !!

Qua đây mình xin Bạn giúp thêm ý này nửa... nha .

1. Yêu cầu chọn đường chia song song với cạnh nào và lấy đó là hướng chia.

2. Chia ra bao nhiêu phần :

a- Đều nhau :

a1. Theo một hướng chuẩn chia qua

a2. Bằng nhau theo cạnh mặt tiền :

a2.1 Theo 1 hướng chia qua

a2.2 Theo hướng vuông góc với hướng mặt tiền.

b- Không đều nhau :

b1. Tính theo phần trăm (%) của từng phần, phần 1 , 2... yêu cầu cho vào là bao nhiêu?

b2. Tình theo diện tích qui định trước của từng phần, phần 1 , 2... yêu cầu cho vào là bao nhiêu?

3. Thể hiện điểm mốc đã chia.

4. Ghi các số cạnh

5. Ghi diện tích

Rất mong được Bạn giúp

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 Bạn đã quan tâm giúp đỡ cho các anh em.

Chương trình rất tuyệt !!

Qua đây mình xin Bạn giúp thêm ý này nửa... nha .

1. Yêu cầu chọn đường chia song song với cạnh nào và lấy đó là hướng chia.

2. Chia ra bao nhiêu phần :

a- Đều nhau :

a1. Theo một hướng chuẩn chia qua

a2. Bằng nhau theo cạnh mặt tiền :

a2.1 Theo 1 hướng chia qua

a2.2 Theo hướng vuông góc với hướng mặt tiền.

b- Không đều nhau :

b1. Tính theo phần trăm (%) của từng phần, phần 1 , 2... yêu cầu cho vào là bao nhiêu?

b2. Tình theo diện tích qui định trước của từng phần, phần 1 , 2... yêu cầu cho vào là bao nhiêu?

3. Thể hiện điểm mốc đã chia.

4. Ghi các số cạnh

5. Ghi diện tích

Rất mong được Bạn giúp

Theo nhìn nhận sơ bộ của ssg thì lisp có khả năng đáp ứng được tất cả các yêu cầu trên. Tuy nhiên:

 

1. Ssg không phải dân trong nghề, nói về đất cát hiểu rất... lơ mơ. Qua cái dự án LandCadViet dang dở ssg đã cảm nhận rất rõ điều đó.

 

2. Bài toán chia đất không đơn giản. Chỉ chia có 1 thửa thành 2 phần mà chương trình đã chạy khá... vất vả! Nếu bạn hiểu một chút về lập trình, bạn sẽ thấy rằng lisp DL đã phải vận dụng các thuật giải không được "chính quy" cho lắm!

Tóm lại, có lẽ ssg không kham nổi, không thể phát triển cái DL thêm nữa. Ssg chỉ có thể sửa các sai sót (nếu có) của chương trình hiện tại mà các bạn phản hồi.

 

3. Các bạn trong nghề và biết lập trình có thể phát triển các ý trên thành chương trình. Nếu có vướng mắc gì về kỹ thuật lập trình lisp, ssg sẽ hỗ trợ thêm.

 

Mong bạn hiểu và thông cảm cho!

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ạ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).

Mình đang bận việc ở Tp.HCM có lẽ tuần sau mình về Ninh Thuận và sau đó mình đến Nha trang Thành phố biển để gặp ssg. Cảm ơn ssg vì đã giúp mình được rất nhiều điề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
Mình đang bận việc ở Tp.HCM có lẽ tuần sau mình về Ninh Thuận và sau đó mình đến Nha trang Thành phố biển để gặp ssg. Cảm ơn ssg vì đã giúp mình được rất nhiều điều.

Mình rất ủng hộ các Bác, vì trong các giải pháp kỹ thuật không những chia đất, cát, biệt thự, tàu thuyên ôtô... mà còn nhiều vấn đề khác nữa, vì vậy tôi muốn có nhiều bài viết chuyên sâu nhất là ssg, tuannguyen..bởi vì đó là công nghệ chính xác và luôn luôn phải sáng tạo ra những cái mớ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
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).

Thanks, mình post bảng toạ độ bằng Excel như sau:

http://www.cadviet.com/upfiles/Book3.xls

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
Thanks, mình post bảng toạ độ bằng Excel như sau:

http://www.cadviet.com/upfiles/Book3.xls

Anh chưa hiểu hết ý của ssg, bảng Excel anh post không có các con số tương ứng với các đường hình trên bản vẽ! Nếu như ssg am hiểu chuyên môn đóng tàu như anh thì không cần anh post file *.xls làm gì. Cái ssg cần là: trong file *.xls có đủ và vừa đúng các số liệu để từ đó anh hình thành nên các đường nét bản vẽ trong file *.dwg. Trên cơ sở đó, ssg sẽ suy luận và hiểu ra được bản chất của vấn đề. Với quan điểm đó, các số liệu thừa sẽ chỉ có tác dụng "gây nhiễu", làm cho ssg khó nắm bắt vấn đề.

Tuy ssg có thể dò tìm và đã nhận ra mối quan hệ giữa cái "Bảng toạ độ" trong file *.dwg và các nét vẽ đường hình. Tuy nhiên, nếu bảng toạ độ ấy nằm trong file *.xls thì sẽ thuận lợi hơn cho lập trình rất nhiều.

Ssg có mấy đề nghị sau:

 

1. Ssg tuy bận tối ngày (hầu như không có khái niệm "khi nào rảnh..."), nhưng đã hứa giúp anh thì sẽ giữ lời. Anh có thể gặp ssg bất cứ lúc nào, nhưng có lẽ tốt hơn là gọi điện hẹn trước.

 

2. Vấn đề anh nêu đã vượt xa ra khỏi nội dung topic này. Anh nên chủ động lập topic mới (trong diễn đàn AutoLisp), tên gọi tuỳ anh đặt sao cho nêu bật được nội dung. Ví dụ: "Lisp thiết kế vỏ tàu", "Lisp vẽ đường hình vỏ tàu", v.v.... Nhiều nội dung khác nhau nằm chung 1 topic sẽ gây khó khăn cho nhiều người khác. Chẳng hạn, các bạn trong ngành trắc địa không quan tâm đến chuyện tàu bè của anh, khi họ vào topic này, họ sẽ bị "gây nhiễu" một cách không cần thiết. Ngược lại, dân tàu bè vào đây đọc các bài về "đất cát" có lẽ cũng không mặn mà gì.

 

3. Tất nhiên là khi gặp trực tiếp, ta sẽ trao đổi cụ thể hơn. Nhưng trước mắt, anh cứ làm như ssg gợi ý ở trên (lập topic mới), trong đó anh post lại:

- Bản vẽ *.dwg

- File *.xls tương ứng với nó

- Giải thích ngắn gọn tiến trình thực hiện bản vẽ *.dwg từ các số liệu cụ thể trong *.xls. Lưu ý rằng, các con số trong *.xls và các nét vẽ trong *.dwg phải khớp nhau thì ssg (và có thể nhiều người khác quan tâm đến chủ đề này) mới hiểu được. Các thông tin, các yếu tố thừa (không liên quan đến yêu cầu lập trình), anh chủ động bỏ bớt đi để khỏi "gây 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

×