Đến nội dung


Hình ảnh
* * - - - 1 Bình chọn

Chia đất!!!


  • Please log in to reply
65 replies to this topic

#1 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 02 February 2009 - 10:55 AM

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!


  • 0

#2 vbao

vbao

    biết lệnh array

  • CADViet Team
  • PipPipPip
  • 184 Bài viết
Điểm đánh giá: 80 (tàm tạm)

Đã gửi 02 February 2009 - 09:53 PM

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

#3 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 February 2009 - 08:55 AM

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

#4 tuannguyen314169

tuannguyen314169

    biết lệnh ddedit

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

Đã gửi 03 February 2009 - 09:46 AM

[quote name='ssg' date='Feb 2 2009, 10:55' post='48931']
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.c...s/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.
  • 0

#5 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 03 February 2009 - 11:33 AM

Ồ 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.
  • 0
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#6 nataca

nataca

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 712 Bài viết
Điểm đánh giá: 553 (tốt)

Đã gửi 03 February 2009 - 01:41 PM

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

#7 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 February 2009 - 02:36 PM

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.c...s/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.c.../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.
  • 0

#8 tuannguyen314169

tuannguyen314169

    biết lệnh ddedit

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

Đã gửi 03 February 2009 - 04:05 PM

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

#9 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 03 February 2009 - 05:02 PM

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

#10 tnmtpc

tnmtpc

    biết dimcontinue

  • Members
  • PipPipPipPipPip
  • 370 Bài viết
Điểm đánh giá: 206 (khá)

Đã gửi 03 February 2009 - 07:30 PM

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

#11 tuannguyen314169

tuannguyen314169

    biết lệnh ddedit

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

Đã gửi 03 February 2009 - 10:17 PM

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

#12 dacvien2007

dacvien2007

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 04 February 2009 - 07:53 AM

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.

  • 0

#13 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 February 2009 - 07:59 AM

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

#14 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 04 February 2009 - 08:17 AM

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

#15 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 04 February 2009 - 09:28 AM

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
  • 0
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#16 dacvien2007

dacvien2007

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 04 February 2009 - 12:15 PM

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

#17 elleHCSC

elleHCSC

    biết lệnh copy

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

Đã gửi 04 February 2009 - 03:14 PM

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...
  • 0
Share for all, all will share !

--------------------
HTTP://WWW.HCSC.VN
HTTP://WWW.HCSC.COM.VN

#18 tuannguyen314169

tuannguyen314169

    biết lệnh ddedit

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

Đã gửi 04 February 2009 - 03:42 PM

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.c...iles/NT06_5.dwg
  • 0

#19 ssg

ssg

    biết lệnh adcenter

  • Vip
  • PipPipPipPipPipPipPip
  • 1228 Bài viết
Điểm đánh giá: 1087 (rất tốt)

Đã gửi 05 February 2009 - 11:48 AM

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.c...les/ChiaDat.zip

Minh hoạ:
Hình đã gửi

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

#20 dacvien2007

dacvien2007

    biết vẽ polygon

  • Members
  • PipPip
  • 75 Bài viết
Điểm đánh giá: 10 (tàm tạm)

Đã gửi 05 February 2009 - 01:14 PM

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