Đến nội dung


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

Viết Lisp theo yêu cầu


  • Chủ đề bị khóa Chủ đề bị khóa
2780 replies to this topic

#461 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 15 February 2008 - 08:33 AM

cho tôi hỏi là, khi mình chọn tính diện tích các hình như thế, cad có phân biệt được hình nào mình pick trước,hình nào pick sau không.nếu có thì trong lisp trên khi chọn đối tượng không cần phải chọn đối tượng từ trái -phải hay phải - trái,trên-dưới,dưới -trên...mà chọn theo thứ tự nào đó theo text định sẵn.sau khi pick xong nó sẽ hỏi bạn muốn chèn kết quả vào text theo thứ tự nào :trái -phải hay phải - trái,trên-dưới,dưới -trên, sau đó chọn tất cả đối tượng text nó sẽ tự động thay dổi kết quả.cảmơn!
  • 0

#462 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 16 February 2008 - 06:42 PM

Có ai có hoặc viết được lisp trên giúp tôi với,đang rất cần.Cảm ơn nhiều hén!
  • 0

#463 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 16 February 2008 - 09:37 PM

Có ai có hoặc viết được lisp trên giúp tôi với,đang rất cần.Cảm ơn nhiều hén!

Tôi đã đọc bài viết của bạn ngay từ khi bạn post bài thứ nhất, nhưng không rõ bạn muốn gì? bạn hỏi quá nhiều thứ, tôi không đủ thông minh để nhận biết được đây là câu hỏi về kiến thức lisp hay đề nghị viết lisp, nên chẳng giúp bạn được.

Trong chủ đề viết lisp theo yêu cầu này đừng làm loãng nó bằng các câu hỏi như: liệu lisp có phân biệt được thế này hay thế kia không, liệu lisp có khả năng làm cái này không,.... bởi nếu trả lời có hay không thì cũng chẳng liên quan gì đến chủ đề này.

Vì thế nếu câu hỏi của bạn là một câu hỏi về kiến thức lisp, bạn hãy post nó ở mục Hỏi về lisp. Còn nếu câu hỏi của bạn là một đề nghị viết lisp theo yêu cầu thì hãy đơn giản hóa yêu cầu của bạn bằng các gạch đầu dòng:
- Thứ bạn có
- Bạn muốn lisp làm gì
- Thứ bạn muốn
Tốt nhất là bạn upload file dwg bao gồm 2 trạng thái, một là trước khi chạy lisp (thứ bạn có) và một là sau khi chạy lisp (cái bạn muốn).

Không chỉ trong diễn đàn CADViet.com, mà cả các nơi khác kể cả trong cuộc sống, hãy biết cách giúp đỡ người mà mình muốn nhờ bằng cách nêu thật rõ và ngắn gọn điều mình mong muốn. Như thế dễ dàng và tốt đẹp cho cả 2 phía.
  • 1

#464 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 17 February 2008 - 09:39 AM

Hic.Xin lỗi vì chưa có kinh ngiệm. Công việc của tôi là tính diện tích đào đăp thông qua trắc ngang. Với mỗi trắc ngang, sẽ có các hạng mục là : diện tích đất cấp 3, đất cấp 4, đá cấp 4, diện tích đào nền, diện tích đào rãnh...và 1 bảng khối lượng đã liệt kê các hạng mục trên. sau khi pick lần lượt các diện tích trên, chọn vào text ghi kết quả chinh la bảng khối lượng đã liệt kê các hạng mục trến theo thứ tự mình đã pick các diện tích.Kết quả tính toán diện tích sẽ tự động điền vào đúng hạng mục mình mong muốn.
  • 0

#465 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 17 February 2008 - 12:11 PM

Hic.Xin lỗi vì chưa có kinh ngiệm. Công việc của tôi là tính diện tích đào đăp thông qua trắc ngang. Với mỗi trắc ngang, sẽ có các hạng mục là : diện tích đất cấp 3, đất cấp 4, đá cấp 4, diện tích đào nền, diện tích đào rãnh...và 1 bảng khối lượng đã liệt kê các hạng mục trên. sau khi pick lần lượt các diện tích trên, chọn vào text ghi kết quả chinh la bảng khối lượng đã liệt kê các hạng mục trến theo thứ tự mình đã pick các diện tích.Kết quả tính toán diện tích sẽ tự động điền vào đúng hạng mục mình mong muốn.

Cảm ơn bạn đã diễn đạt ngắn gọn, tôi hiểu thêm được nhiều. Tuy nhiên, tôi không phải là dân san nền nên vẫn còn chút thắc mắc.

Tôi có các câu hỏi sau mong bạn giải đáp giúp thì tôi sẽ viết được lisp:
- Câu 'sau khi pick lần lượt các diện tích trên' thì diện tích ở đây là đối tượng gì?
- Số lượng các đối tượng 'diện tích' với số các đối tượng text có bằng nhau không? Xử lý thế nào khi 2 lần chọn không bằng nhau?
- Thứ tự liên quan giữa pick đối tượng và text ra sao? VD: đối tượng pick trước thì gán vào text pick trước, hay text phía trên, hay text phía trái? vì tôi không biết bảng của bạn bố cục ra sao. Đối tượng diện tích có sự liên quan về vị trí với nhau không? nếu có thì bạn đỡ phải pick từng cái, sẽ chọn toàn bộ 1 lúc luôn, lisp tự phân chia thứ tự.
- Bạn dùng AutoCAD version bao nhiêu, nếu là lớn hơn 2005 thì có thể làm được sự liên kết động giữa giá trị diện tích của một đối tượng và giá trị text, tức là khi diện tích đối tượng thay đổi, text sẽ tự thay đổi theo.

Nếu được thì tốt nhất, bạn hãy upload 1 file dwg, có 2 trạng thái, trạng thái 1 là trước khi chạy lisp, trạng thái 2 là sau khi chạy lisp, tôi sẽ tự hiểu tất cả các vấn đề về đối tượng cũng như version ACAD mà bạn đang dùng, sẽ không phải hỏi bạn nhiều.
  • 0

#466 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 17 February 2008 - 07:27 PM

Xin lỗi vì đang ở nhà nên không có bản vẽ ở đây, Tôi sẽ cố gắng giải thích ý của tôi một cách rõ ràng nhất :
- Câu 'sau khi pick lần lượt các diện tích trên' thì diện tích ở đây là đối tượng gì? : diện tích ở đây là các hình khép kín, có thể là chữ nhât, tam giác, hoặc đa giác, ...đó chính là các diện tích như diện tích khuôn đường, diện tích đào đá cấp 3, hoặc đất cấp 3, diện tích nền ..... trên trắc ngang. Mỗi lần chuyển qua một hạng mục khác kết thúc bằng enter có ngiã là :ví dụ- Diện tích đào khuôn đường có thể gồm nhiều hình khác nhau, sau khi pick các hình này xong để chuyển qua hạng mục khác như diện tích đào đá cấp 3, hoặc đất cấp 3, diện tích nền....kết thúc bằng enter.Kết quả diện tích đào khuôn đường chính là tổng diện tích các hình mình đã pick .
- "Số lượng các đối tượng 'diện tích' với số các đối tượng text có bằng nhau không? Xử lý thế nào khi 2 lần chọn không bằng nhau?"do các đối tượng text có thể edit dễ dàng nên tốt nhất là số lượng dối tượng 'diện tích' với số các đối tượng text bằng nhau.có thể bão lỗi trong trường hợp không bằng nhau.
- "Thứ tự liên quan giữa pick đối tượng và text ra sao? VD: đối tượng pick trước thì gán vào text pick trước, hay text phía trên, hay text phía trái? vì tôi không biết bảng của bạn bố cục ra sao. Đối tượng diện tích có sự liên quan về vị trí với nhau không? nếu có thì bạn đỡ phải pick từng cái, sẽ chọn toàn bộ 1 lúc luôn, lisp tự phân chia thứ tự." đúng, sau khi pick xong các đối tượng, sẽ chọn toàn bộ một lúc, đến đây lisp sẽ yêu cầu : chọn trật tự trên-dưới,dưới trên,trái-phải,phải trải ..của đối tượng text.sau khi chọn thì kết quả sẽ tương ứng thứ tự pick và trật tự mình chọn.
Bố cục text tôi thường làm là trên xuống, nhưng có thể để tổng quát cho nhiều trường hợp là chọn trật tự trên-dưới,dưới trên,trái-phải,phải trái
- tôi dùng cad 2007.Cảm ơn vì đã quan tâm!
  • 0

#467 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 17 February 2008 - 11:01 PM

Chương trình dưới đây thực hiện điều bạn muốn.

Lệnh là gdt (gán diện tích).

(defun gan (entob enttext / tt gt)
(setq
tt (entget enttext)
gt (strcat "%<\\AcObjProp Object(%<\\_ObjId "
(itoa (vla-get-ObjectID (vlax-ename->vla-object entob)))
">%).Area \\f \"%lu2\">%"
)
)
(entmod (subst (cons 1 gt) (assoc 1 tt) tt))
(entupd enttext)
)

(defun sapxep (lstt dx dy)
(vl-sort lstt
'(lambda (e1 e2)
(< (+ (* (car (cdr (assoc 10 (entget e1)))) dx)
(* (cadr (cdr (assoc 10 (entget e1)))) dy)
)
(+ (* (car (cdr (assoc 10 (entget e2)))) dx)
(* (cadr (cdr (assoc 10 (entget e2)))) dy)
)
)
)
)
)

(defun c:gdt ()
(princ "\nHay chon cac doi tuong dien tich: ")
(setq
ssob (ssget '((-4 . " (0 . "HATCH")
(0 . "*POLYLINE")
(0 . "CIRCLE")
(0 . "REGION")
(-4 . "OR>")
)
)
)
(princ "\nHay chon cac doi tuong text: ")
(setq
sst (ssget '((0 . "TEXT")))
)
(if (/= (sslength ssob) (sslength sst))
(alert "So doi tuong cua 2 lan chon khac nhau!!!")
(progn
(initget "Trai-phai Phai-trai tRen-xuong Duoi-len tHeo pick"
)
(setq
lstob (ss2ent ssob)
lstt (ss2ent sst)
chon (getkword
"\nChon thu tu cua text (Trai-phai/Phai-trai/tRen-xuong/Duoi-len/): "
)
)
(if (= chon "Trai-phai")
(setq lstt (sapxep lstt 1 0))
)
(if (= chon "Phai-trai")
(setq lstt (sapxep lstt -1 0))
)
(if (= chon "Duoi-len")
(setq lstt (sapxep lstt 0 1))
)
(if (= chon "tRen-xuong")
(setq lstt (sapxep lstt 0 -1))
)
(mapcar 'gan lstob lstt)
)
)
(command ".regen")
(princ)
)

(defun ss2ent (ss / sodt index lstent)
(setq
sodt (if ss
(sslength ss)
0
)
index 0
)
(repeat sodt
(setq ent (ssname ss index)
index (1+ index)
lstent (cons ent lstent)
)
)
(reverse lstent)
)

  • 1

#468 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 17 February 2008 - 11:04 PM

Xin lisp vẽ hình trụ tròn (khối solid) từ 1 (hoặc nhiều) đối tượng line được chọn có nội dung như sau:
trên màn hình là 1 line, chạy lisp hỏi chọn line, kết quả là chương trình sẽ vẽ ra được 1 đối tượng hình trụ tròn có chiều dài bằng line, và đường thẳng đó
thì đi qua tâm của hình trụ. mong bác Hoành giúp đỡ, em cám ơn nhiều!
  • 0

#469 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 17 February 2008 - 11:44 PM

Xin lisp vẽ hình trụ tròn (khối solid) từ 1 (hoặc nhiều) đối tượng line được chọn có nội dung như sau:
trên màn hình là 1 line, chạy lisp hỏi chọn line, kết quả là chương trình sẽ vẽ ra được 1 đối tượng hình trụ tròn có chiều dài bằng line, và đường thẳng đó
thì đi qua tâm của hình trụ. mong bác Hoành giúp đỡ, em cám ơn nhiều!

Bán kính trụ thì sao bạn?
Nhập vào hay pick điểm, có thay đổi không?
  • 0

#470 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 18 February 2008 - 08:10 AM

Tôi dùng rồi.cảm ơn bác nhé.Nhưng việc chọn đối tượng như lisp này không tiện bằng cách pick vào trong miền các đối tượng như việc tô màu vật liệu ấy (Hatch).Việc lựa chọn bằng cách pick nhanh hơn và thực hiện đc trực tiếp trên trắc ngang.Còn như lisp này thì phải bo lại mới dùng đc.Bác sửa giúp tôi nhé!

Có nhiều hạng mục chẳng hạn Diện tích đào nền gồm nhiều đối tượng pick tách rời nhau,vì bác chưa hiểu ý của tôi, cũng do cách diễn đạt của tôi còn khó hiểu:
+co nhiều hạng mục tính toán:tôi lấy ví dụ có 2 - diện tích đào khuôn đường(DKĐ)
- diện tích đào đá cấp 3(DĐĐ)
DKĐ gồm nhiều đối tượng hình vẽ,sau khi load lisp này mình sẽ pick lần lượt các đối tượng hình vẽ và hoàn thành = cách ấn enter và chuyển sang DĐĐ cũng nhiều đối tượng hình vẽ.sau khi chọn xong đối tượng hình vẽ lisp yêu cầu chọn text. Trong lisp của bác yêu cầu chọn từng text nhưng theo tôi có thể chọn tất cả các đối tượng text một lần sau đó sẽ chọn trật tự trên dưới,trái -phải...và kết quả sẽ theo thứ tự ..
  • 0

#471 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 18 February 2008 - 11:38 AM

Bán kính trụ thì sao bạn?
Nhập vào hay pick điểm, có thay đổi không?

À vâng, lisp hỏi nhập thêm bán kính trụ tròn nữa anh ạ, có thể nhập trực tiếp bằng số
thực (real) hoặc pick 2 điểm trên màn hình! thanks bác trước!!
  • 0

#472 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 18 February 2008 - 10:10 PM

Có nhiều hạng mục chẳng hạn Diện tích đào nền gồm nhiều đối tượng pick tách rời nhau,vì bác chưa hiểu ý của tôi, cũng do cách diễn đạt của tôi còn khó hiểu:
+co nhiều hạng mục tính toán:tôi lấy ví dụ có 2 - diện tích đào khuôn đường(DKĐ)
- diện tích đào đá cấp 3(DĐĐ)
DKĐ gồm nhiều đối tượng hình vẽ,sau khi load lisp này mình sẽ pick lần lượt các đối tượng hình vẽ và hoàn thành = cách ấn enter và chuyển sang DĐĐ cũng nhiều đối tượng hình vẽ.sau khi chọn xong đối tượng hình vẽ lisp yêu cầu chọn text. Trong lisp của bác yêu cầu chọn từng text nhưng theo tôi có thể chọn tất cả các đối tượng text một lần sau đó sẽ chọn trật tự trên dưới,trái -phải...và kết quả sẽ theo thứ tự ..

Bạn hãy post file DWG lên.

Nếu bạn post file lên từ đầu, đã không mất quá nhiều công sức và thời gian của bạn và tôi.
  • 0

#473 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 18 February 2008 - 10:22 PM

À vâng, lisp hỏi nhập thêm bán kính trụ tròn nữa anh ạ, có thể nhập trực tiếp bằng số
thực (real) hoặc pick 2 điểm trên màn hình! thanks bác trước!!

Lệnh là L2C (line to cylinder)

(defun c:l2c ()
(defun cyl (ent / tt)
(setq
tt (entget ent)
p1 (trans (cdr (assoc 10 tt)) 0 1)
p2 (trans (cdr (assoc 11 tt)) 0 1)
)
(command ".CYLINDER" p1 r "a" p2)
)

(setq ss (ssget '((0 . "LINE")))
r (getdist "\nBan kinh Cylinder: ")
oldos (getvar "osmode")
)
(setvar "osmode" 0)
(sudung cyl ss)
(setvar "osmode" oldos)
(princ)
)

(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)

  • 1

#474 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 February 2008 - 05:16 PM

đây là link http://www.cadviet.c...iles/Tn12dc.dwg
bác giúp nhé!
  • 0

#475 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 19 February 2008 - 05:27 PM

http://www.mediafire.com/?9jojyxgcwy0 đây là link secure
đây là bản vẽ thôi,Nguyenhoanh sẽ hiểu những gì tôi đã hỏi trên!
  • 0

#476 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 19 February 2008 - 07:11 PM

Lệnh là L2C (line to cylinder)


(defun c:l2c ()
(defun cyl (ent / tt)
(setq
tt (entget ent)
p1 (trans (cdr (assoc 10 tt)) 0 1)
p2 (trans (cdr (assoc 11 tt)) 0 1)
)
(command ".CYLINDER" p1 r "a" p2)
)

(setq ss (ssget '((0 . "LINE")))
r (getdist "\nBan kinh Cylinder: ")
oldos (getvar "osmode")
)
(setvar "osmode" 0)
(sudung cyl ss)
(setvar "osmode" oldos)
(princ)
)

(defun sudung (ham ss / sodt index entdt soapp)
(setq sodt (cond
(ss (sslength ss))
(t 0)
)
soapp 0
index 0
)
(repeat sodt
(setq entdt (ssname ss index)
index (1+ index)
)
(if (ham entdt)
(setq soapp (1+ soapp))
)
)
soapp
)

Bị lỗi 1 chút anh à, anh xem lại giúp em:
Nếu em nhập số thì báo lỗi :
Ban kinh Cylinder: 5
; error: no function definition: SUDUNG

Nếu em nhập 2 điểm trên màn hình thì báo lỗi :

Select objects: 1 found
Select objects:
Ban kinh Cylinder: Specify second point: ; error: no function definition:
SUDUNG

Và khi appload lệnh thì chưa gõ l2c nó đã vào lệnh luôn rồi!! Mong bác giúp em
  • 0

#477 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 19 February 2008 - 08:30 PM

Bị lỗi 1 chút anh à, anh xem lại giúp em:
Nếu em nhập số thì báo lỗi :
Ban kinh Cylinder: 5
; error: no function definition: SUDUNG

Nếu em nhập 2 điểm trên màn hình thì báo lỗi :

Select objects: 1 found
Select objects:
Ban kinh Cylinder: Specify second point: ; error: no function definition:
SUDUNG

Và khi appload lệnh thì chưa gõ l2c nó đã vào lệnh luôn rồi!! Mong bác giúp em

Đoạn lisp trên không có gì sai cả.
Lỗi trên do bạn copy thiếu dấu ngoặc, hãy copy lại.
Hãy làm thật thận trọng trong việc copy, nếu xảy ra lỗi hãy kiểm tra thật kỹ lưỡng.
Bởi vì lisp chạy được thì tôi mới post lên.
  • 1

#478 xaydung

xaydung

    biết lệnh trim

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

Đã gửi 20 February 2008 - 03:48 PM

Đoạn lisp trên không có gì sai cả.
Lỗi trên do bạn copy thiếu dấu ngoặc, hãy copy lại.
Hãy làm thật thận trọng trong việc copy, nếu xảy ra lỗi hãy kiểm tra thật kỹ lưỡng.
Bởi vì lisp chạy được thì tôi mới post lên.

À, được rồi. Rất cám ơn anh Hoành đã giúp, em đang cần 1 lisp nữa nội dung cũng gần tương tự với lisp trên
chỉ khác đối tượng chọn không phải là line nữa mà là 1 arc (hoặc nhiều arc)
Bình thường em phải vẽ 1 circle rồi extrude theo đường path là arc rất mất thời gian,
Mong bác giúp em cái này nữa nha, thanks!!
  • 0

#479 anhducna

anhducna

    biết vẽ arc

  • Members
  • PipPip
  • 40 Bài viết
Điểm đánh giá: 0 (bình thường)

Đã gửi 20 February 2008 - 09:15 PM

Bác Hoanh xem bản vẽ của tôi chưa?mong bác giúp lắm lắm!
  • 0

#480 Nguyen Hoanh

Nguyen Hoanh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 4105 Bài viết
Điểm đánh giá: 4495 (đỉnh cao)

Đã gửi 20 February 2008 - 10:41 PM

Bác Hoanh xem bản vẽ của tôi chưa?mong bác giúp lắm lắm!

File nào bạn?
  • 0