Đế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

#601 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 29 March 2008 - 03:07 PM

dưới đây là bản vẽ (thi công lắp đặt nước)
trong đó em có rất nhiều các block về : T, Lơi, Co, I ....
do có nhiều đường ống kích cỡ khác nhau nên các block em phải scale lại
chính vì vậy, nếu em sử dụng chương trình .lisp đếm block sẽ ko có ý nghĩa gì nhiều (chỉ đơn giản là đếm tổng số)
do đó em cần một .lisp có thể tính được số block có kích cỡ khác nhau.
rất mong bác giúp đỡ.


Bạn muốn kết quả như thế nào với file bạn vừa upload?
  • 0

#602 pooh_21

pooh_21

    biết zoom

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

Đã gửi 29 March 2008 - 11:22 PM

Mình muốn xin một lisp nối 2 đoạn thẳng dời nhau lại thành 1 đoạn thẳng liền

Ví dụ: Có 2 cặp đoạn thẳng như dưới
____________ _______________
______________ _____________

sau khi dùng lisp chọn 2 cặp trên sẽ được 2 đoạn thẳng liền nhau.

____________________________
____________________________
  • 0

#603 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 29 March 2008 - 11:49 PM

Mình muốn xin một lisp nối 2 đoạn thẳng dời nhau lại thành 1 đoạn thẳng liền

Ví dụ: Có 2 cặp đoạn thẳng như dưới
____________ _______________
______________ _____________

sau khi dùng lisp chọn 2 cặp trên sẽ được 2 đoạn thẳng liền nhau.

____________________________
____________________________

bạn dùng lệnh Join của AutoCAD (từ phiên bản 2007).
hoặc lệnh JL (join line) dưới đây. Khi gọi lệnh JL, chương trình sẽ yệu cầu bạn chọn crossing qua 1 vùng cửa sổ chứa 2 line cần nối.

(defun c:jl (/ p1 p2 p3 ssdt entla entlb tt p1a p2a tt p1b p2b layermoi TAPLINEMOI TENLAYERMOI)
(defun thanghang (p0 p1 p2 / dx1 dy1 dx2 dy2 x1 y1 x2 y2 x0 y0)
(setq
x0 (car p0)
y0 (cadr p0)
x1 (car p1)
y1 (cadr p1)
x2 (car p2)
y2 (cadr p2)
dx1 (- x1 x0)
dy1 (- y1 y0)
dx2 (- x2 x0)
dy2 (- y2 y0)
)
(if (equal (* dx1 dy2) (* dx2 dy1) 0.01)
t
nil
)
)
(defun noiline (p1 p2 p3 p4 / kq dmax)
(if (and (thanghang p1 p2 p3) (thanghang p1 p2 p4))
(progn
(setq d1 (distance p1 p3)
d2 (distance p1 p4)
d3 (distance p2 p3)
d4 (distance p2 p4)
dmax (max d1 d2 d3 d4)
kq (cond
((= dmax d1) (list p1 p3))
((= dmax d2) (list p1 p4))
((= dmax d3) (list p2 p3))
((= dmax d4) (list p2 p4))
(t nil)
)
)
kq
)
nil
)
)
(setq
p1 (getpoint "\ngoc dau: ")
p2 (getcorner p1 "\ngoc sau: ")
ssdt (ssget "c" p1 p2 '((0 . "LINE")))
entla (ssname ssdt 0)
entlb (ssname ssdt 1)
tt (entget entla)
p1a (cdr (assoc 10 tt))
p2a (cdr (assoc 11 tt))
tt (entget entlb)
p1b (cdr (assoc 10 tt))
p2b (cdr (assoc 11 tt))
tenlayermoi (cdr (assoc 8 (entget entla)))
)
(if (setq taplinemoi (noiline p1a p2a p1b p2b))
(progn
(command ".erase" ssdt "")
(entmake
(list
(cons 0 "LINE")
(cons 8 tenlayermoi)
(cons 10 (car taplinemoi))
(cons 11 (cadr taplinemoi))
)
)
)
(princ "\nKhong the noi line duoc !")
)
(princ)
)

  • 2

#604 nnt12yeu

nnt12yeu

    biết vẽ line

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

Đã gửi 30 March 2008 - 12:50 PM

Bạn muốn kết quả như thế nào với file bạn vừa upload?

thưc ra em chỉ cần một điều kiện nào đó để có thể biết được số lượng của các thiết bị (ví dụ như T fi-20, fi-27... là bao nhiêu)
kết quả xuất ra có thể là bất kì, có thể là:
command: tongbl (enter)
(s)pecified (enter)
A1 (enter)
xuất ra
9 block A1 co dien tich X m2 (hoặc là chu vi X m, hoặc là chiều dài của cạnh đứng)
11 block A1 co dien tich la Y m2
3 block A1 co dien tich la Z m2
.....
X < Y < Z < .....
  • 0

#605 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 30 March 2008 - 01:28 PM

thưc ra em chỉ cần một điều kiện nào đó để có thể biết được số lượng của các thiết bị (ví dụ như T fi-20, fi-27... là bao nhiêu)
kết quả xuất ra có thể là bất kì, có thể là:
command: tongbl (enter)
(s)pecified (enter)
A1 (enter)
xuất ra
9 block A1 co dien tich X m2 (hoặc là chu vi X m, hoặc là chiều dài của cạnh đứng)
11 block A1 co dien tich la Y m2
3 block A1 co dien tich la Z m2
.....
X < Y < Z < .....

Số lượng thì ok.
Nhưng diện tích thì tôi chịu không biết lấy diện tích ở đâu?
  • 0

#606 hoanghuy

hoanghuy

    biết pan

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

Đã gửi 30 March 2008 - 03:17 PM

Mình là thành viên mới gia nhập, xin chào CadViet. Hiện nay mình đang cần một lisp để mở bản vẽ, mong các bác giúp đỡ. Vì mình cũng đang nghiên cứu Lisp nên rất khó khăn.
  • 0

#607 nnt12yeu

nnt12yeu

    biết vẽ line

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

Đã gửi 30 March 2008 - 03:18 PM

Số lượng thì ok.
Nhưng diện tích thì tôi chịu không biết lấy diện tích ở đâu?

vậy bác có cách nào đo được chiều dài cạnh nào đó của block ko, hay lấy tỉ lệ scale của các block so với block chuẩn.
  • 0

#608 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 30 March 2008 - 03:44 PM

vậy bác có cách nào đo được chiều dài cạnh nào đó của block ko, hay lấy tỉ lệ scale của các block so với block chuẩn.

tỷ lệ (scale) block thì lấy được.

Còn chiều dài cạnh nào đó thì chịu.
  • 1

#609 nnt12yeu

nnt12yeu

    biết vẽ line

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

Đã gửi 30 March 2008 - 04:15 PM

tỷ lệ (scale) block thì lấy được.

Còn chiều dài cạnh nào đó thì chịu.

vậy thì hay quá
vậy bác viết cho em 1 .lisp tính tổng số block và đếm theo tỉ lệ scale so với block chuẩn với nhé
em thanks bác trước nhé.
  • 0

#610 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 30 March 2008 - 08:24 PM

vậy thì hay quá
vậy bác viết cho em 1 .lisp tính tổng số block và đếm theo tỉ lệ scale so với block chuẩn với nhé
em thanks bác trước nhé.


lệnh DEMBL dưới đây sẽ giúp bạn:
(defun c:dembl( / kq)
(defun ttbl(ent)
(setq tt (entget ent)
name (cdr (assoc 2 tt))
tl (vl-string-trim "." (vl-string-trim "0" (rtos (abs (cdr (assoc 41 tt))))))
)
(strcat name "*" tl)
)
(setq ss (ssget '((0 . "INSERT")))
lst (ss2ent ss)
lst (mapcar 'ttbl lst)

)
(foreach e lst
(if (setq old (assoc e kq))
(setq kq (subst (cons e (1+ (cdr old))) old kq))
(setq kq (append kq (list (cons e 1))))
)
)

(foreach e kq
(princ (strcat "\n" (itoa (cdr e))" block " (vl-string-subst " co ty le " "*" (car e)) ))
)
(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

#611 nnt12yeu

nnt12yeu

    biết vẽ line

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

Đã gửi 30 March 2008 - 11:08 PM

lệnh DEMBL dưới đây sẽ giúp bạn:

(defun c:dembl( / kq)
(defun ttbl(ent)
(setq tt (entget ent)
name (cdr (assoc 2 tt))
tl (vl-string-trim "." (vl-string-trim "0" (rtos (abs (cdr (assoc 41 tt))))))
)
(strcat name "*" tl)
)
(setq ss (ssget '((0 . "INSERT")))
lst (ss2ent ss)
lst (mapcar 'ttbl lst)

)
(foreach e lst
(if (setq old (assoc e kq))
(setq kq (subst (cons e (1+ (cdr old))) old kq))
(setq kq (append kq (list (cons e 1))))
)
)

(foreach e kq
(princ (strcat "\n" (itoa (cdr e))" block " (vl-string-subst " co ty le " "*" (car e)) ))
)
(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)
)

em xin cám ơn bác rất nhiều, em đã chạy được chương trình rùi.
  • 0

#612 nataca

nataca

    biết lệnh adcenter

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

Đã gửi 31 March 2008 - 12:04 AM

lệnh DEMBL dưới đây sẽ giúp bạn:

(defun c:dembl( / kq)
(defun ttbl(ent)
(setq tt (entget ent)
name (cdr (assoc 2 tt))
tl (vl-string-trim "." (vl-string-trim "0" (rtos (abs (cdr (assoc 41 tt))))))
)
(strcat name "*" tl)
)
(setq ss (ssget '((0 . "INSERT")))
lst (ss2ent ss)
lst (mapcar 'ttbl lst)

)
(foreach e lst
(if (setq old (assoc e kq))
(setq kq (subst (cons e (1+ (cdr old))) old kq))
(setq kq (append kq (list (cons e 1))))
)
)

(foreach e kq
(princ (strcat "\n" (itoa (cdr e))" block " (vl-string-subst " co ty le " "*" (car e)) ))
)
(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)
)

Nếu scale block với tỷ lệ <1 ví dụ 0.3 thì Lisp sẽ hiểu là 3. Tức nếu có 2block scale đi=0.3Block ban đầu và 1 block scale đi =3Block ban đầu thì kết quả sẽ cho 3 block có tỷ lệ 3.
  • 0

#613 xgame

xgame

    biết vẽ arc

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

Đã gửi 31 March 2008 - 03:59 PM

Các bác có thể giúp em một viết Lisp có tác dụng đếm những đối tượng Line, Polyline, Circle, Arc có kích thước nhập vào theo ý mình. Nếu là line, polyline: nhập chiều dài; Circle: nhập đường kính (or bán kính)
Cấu trúc lệnh như sau:
- Gõ lệnh dkt -> Chọn toàn bộ bản vẽ -> Nhập 1 đối tượng cần đếm (Line/Pline/Circle/Arc)->Nhập kích thước của đối tượng cần đếm-->Đưa ra kết quả là số đối tượng có kích thước mà ta đã nhập.
Trong một bản vẽ cơ khí xây dựng,hoặc nội thất có rất nhiều chi tiết lỗ (để bắt bulon chẳng hạn), song cửa, em muốn ứng dụng lisp này để đếm số lượng lỗ (tương ứng với circle, arc), song cửa: sắt, nhôm kính, gỗ, nhựa....(tương ứng với line, pline) có kích thước do mình nhập vào để dự trù tính được số lượng vật liệu, thuận tiện cho việc đưa vào gia công sản xuất. Em nghĩ cái này rất cần thiết với nhiều người lắm.
Cảm ơn các bác nhiều.
  • 0

#614 xgame

xgame

    biết vẽ arc

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

Đã gửi 07 April 2008 - 11:13 AM

Các bác có thể giúp em một viết Lisp có tác dụng đếm những đối tượng Line, Polyline, Circle, Arc có kích thước nhập vào theo ý mình. Nếu là line, polyline: nhập chiều dài; Circle: nhập đường kính (or bán kính)
Cấu trúc lệnh như sau:
- Gõ lệnh dkt -> Chọn toàn bộ bản vẽ -> Nhập 1 đối tượng cần đếm (Line/Pline/Circle/Arc)->Nhập kích thước của đối tượng cần đếm-->Đưa ra kết quả là số đối tượng có kích thước mà ta đã nhập.
Trong một bản vẽ cơ khí xây dựng,hoặc nội thất có rất nhiều chi tiết lỗ (để bắt bulon chẳng hạn), song cửa, em muốn ứng dụng lisp này để đếm số lượng lỗ (tương ứng với circle, arc), song cửa: sắt, nhôm kính, gỗ, nhựa....(tương ứng với line, pline) có kích thước do mình nhập vào để dự trù tính được số lượng vật liệu, thuận tiện cho việc đưa vào gia công sản xuất. Em nghĩ cái này rất cần thiết với nhiều người lắm.
Cảm ơn các bác nhiều.

Có vẻ như vấn đề đặt ra của em khó mà thực hiện được phải vậy không các bác? Xin các bác cho em đôi lời về vấn đề này nhé.
  • 0

#615 vndesperados

vndesperados

    biết lệnh xref

  • Members
  • PipPipPipPipPipPipPip
  • 547 Bài viết
Điểm đánh giá: 253 (khá)

Đã gửi 07 April 2008 - 11:21 AM

Có vẻ như vấn đề đặt ra của em khó mà thực hiện được phải vậy không các bác? Xin các bác cho em đôi lời về vấn đề này nhé.


Đây chỉ là một bài tóan thống kê, cực kỳ dễ luôn.
Nếu bạn chịu khó đọc bài trên diễn đàn này thì bạn cũng có thể tự mình viết ra được code
  • 0

#616 duy782006

duy782006

    PHẠM QUỐC DUY

  • CADViet Team
  • PipPipPipPipPipPipPip
  • 2155 Bài viết
Điểm đánh giá: 1359 (rất tốt)

Đã gửi 07 April 2008 - 02:04 PM

Mình là thành viên mới gia nhập, xin chào CadViet. Hiện nay mình đang cần một lisp để mở bản vẽ, mong các bác giúp đỡ. Vì mình cũng đang nghiên cứu Lisp nên rất khó khăn.


Mục đích của bạn như thế nào. Sao phải dùng lisp mở bản vẽ. Bạn nêu nyêu cầu rỏ rỏ chút được không.

(setq tenfilecođuongan (getfiled "CHON FILE " "" "dwg" 0))
Đây là dòng gợi ý. Làm xuất hiệu hộp thoại chọn file mặc định kiểu file là dwg.
Dữ liệu thu được là tenfilecođuongan chứa tên đầy đủ của file bạn chọn. sau đó xào nấu thế nào là việc của bạn.
  • 0

Cứ ngỡ trần gian là cõi thật.Cho nên tất bật đến bây giờ.
Tạo hộp thoại bằng lisp My blog QUY ĐỊNH ĐẶT TÊN TOPIC TRONG CHUYÊN MỤC LISPD http://ktsduy.wordpress.com/
Để cám ơn chỉ cần nhấn rep_up.png
(Là nhấn vào nút đó phía bài viết của người ta í chứ đừng có nhè cái hình này mà nhấn miết đi nha :-D


#617 xgame

xgame

    biết vẽ arc

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

Đã gửi 08 April 2008 - 08:42 AM

Đây chỉ là một bài tóan thống kê, cực kỳ dễ luôn.
Nếu bạn chịu khó đọc bài trên diễn đàn này thì bạn cũng có thể tự mình viết ra được code

Vấn đề là em không biết chút xíu kiến thức gì về lisp nên em mới mạn phép post bài nhờ sự giúp đỡ của các bác.
  • 0

#618 xgame

xgame

    biết vẽ arc

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

Đã gửi 08 April 2008 - 08:45 AM

Bác Hoành ơi, bác giúp em được không?
  • 0

#619 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 08 April 2008 - 09:19 AM

Bác Hoành ơi, bác giúp em được không?

Arc chỉ cần bán kính, có quan tâm đến chiều dài không bạn?
  • 0

#620 xgame

xgame

    biết vẽ arc

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

Đã gửi 08 April 2008 - 10:45 AM

Arc chỉ cần bán kính, có quan tâm đến chiều dài không bạn?

Với arc hoặc circle thì không cần chiều dài cũng được ạ, chỉ cần bán kính or đường kính, em tự tính bằng tay chiều dài khi đã đếm được đối tượng có bán kính or đường kính. Cảm ơn pác, nếu được thì tốt quá.
  • 0