Đến nội dung


Hình ảnh
- - - - -

Nhờ các bác viết hộ lisp giúp thống kê thép nhanh hơn.


  • Please log in to reply
17 replies to this topic

#1 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 05 April 2010 - 09:39 PM

Nhờ các bác viết hộ lisp thực hiện yêu cầu sau:
Bản vẽ đã có các thanh thép. Giờ viết ghi chú cho các thanh thép. Em muốn các bác viết hộ em để thực hiện như sau:
- Nhập tên lệnh.
- Chọn điểm đầu để viết chỉ dẫn.
- Chọn các điểm tiếp theo.
- Enter hoặc ấn cách để kết thúc lệnh.
- Hình vẽ minh họa như sau:
http://www.cadviet.c...s/2/diemtam.jpg
  • 0

#2 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 06 April 2010 - 08:38 AM

Nhờ các bác viết hộ lisp thực hiện yêu cầu sau:
Bản vẽ đã có các thanh thép. Giờ viết ghi chú cho các thanh thép. Em muốn các bác viết hộ em để thực hiện như sau:
- Nhập tên lệnh.
- Chọn điểm đầu để viết chỉ dẫn.
- Chọn các điểm tiếp theo.
- Enter hoặc ấn cách để kết thúc lệnh.
- Hình vẽ minh họa như sau:
http://www.cadviet.c...s/2/diemtam.jpg

Các cao thủ của diễn đàn mình đâu hết rồi. Giúp em chút đi, em đang cần giấp.
  • 0

#3 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 07 April 2010 - 02:28 PM

Trong Cad có sẵn lẹnh "qleader" rồi mà, chọn setting để thiết lập các lựa chọn.
  • 0

#4 phamthanhbinh

phamthanhbinh

    biết lệnh adcenter

  • Moderator
  • PipPipPipPipPipPipPip
  • 6007 Bài viết
Điểm đánh giá: 3113 (tuyệt vời)

Đã gửi 07 April 2010 - 04:36 PM

Các cao thủ của diễn đàn mình đâu hết rồi. Giúp em chút đi, em đang cần giấp.

Chào bạn bktec84,
Chưa hiểu bạn muốn yêu cầu gì thì làm sao mà giúp. Bạn hãy trình bày cụ thể hơn cái kết quả mà bạn muốn có, Bản vẽ bạn gửi chả nói lên điều gì cả.
  • 0
Chúc các quý Anh trên diễn đàn luôn khỏe, đẻ thêm được nhiều thứ để mót.

#5 ketui

ketui

    biết vẽ arc

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

Đã gửi 07 April 2010 - 05:05 PM

Nhờ các bác viết hộ lisp thực hiện yêu cầu sau:
Bản vẽ đã có các thanh thép. Giờ viết ghi chú cho các thanh thép. Em muốn các bác viết hộ em để thực hiện như sau:
- Nhập tên lệnh.
- Chọn điểm đầu để viết chỉ dẫn.
- Chọn các điểm tiếp theo.
- Enter hoặc ấn cách để kết thúc lệnh.
- Hình vẽ minh họa như sau:
Hình đã gửi


Làm được thôi.
Cái mũi tên đó bạn ưng bao lớn.
Sau khi vẽ ra 1 đống mũi tên và line thi làm gì nửa.
  • 0

#6 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 07 April 2010 - 10:41 PM

Chào bạn bktec84,
Chưa hiểu bạn muốn yêu cầu gì thì làm sao mà giúp. Bạn hãy trình bày cụ thể hơn cái kết quả mà bạn muốn có, Bản vẽ bạn gửi chả nói lên điều gì cả.

Cảm ơn các anh đã quan tâm. Ý của em muốn như thế này: có rất nhiều thanh thép có cùng 1 ký hiệu. Nếu dùng lệnh Leader bình thường thì khi nhập phải nhập điểm đầu điểm cuối, như vậy có n thanh thép thì ta phải nhập 2n điểm đầu( vị trí thanh thép) và điểm cuối (điểm ghi tên thanh thép). Nhưng điểm cuối luôn trùng nhau, lên như vậy ta phí mất (n-1) lần nhập điểm đó.
Vì vậy em muốn các anh viết giúp em cái lisp làm việc như sau:
- đánh tên lệnh.
- Chọn điểm điểm cuối (điểm ghi tên thanh thép).
- chọn các điểm đầu ( vị trí các thanh thép).
- ấn phím cách hoặc enter để kết thúc lệnh.
(Chú ý là các đường leader chỉ cần có 2 điểm là điểm đầu điểm cuối, không cần ghi Mtext hay text vì ký hiệu thép em đã có block.)
Cảm ơn các anh!
  • 0

#7 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 07 April 2010 - 11:37 PM

Cảm ơn các anh đã quan tâm. Ý của em muốn như thế này: có rất nhiều thanh thép có cùng 1 ký hiệu. Nếu dùng lệnh Leader bình thường thì khi nhập phải nhập điểm đầu điểm cuối, như vậy có n thanh thép thì ta phải nhập 2n điểm đầu( vị trí thanh thép) và điểm cuối (điểm ghi tên thanh thép). Nhưng điểm cuối luôn trùng nhau, lên như vậy ta phí mất (n-1) lần nhập điểm đó.
Vì vậy em muốn các anh viết giúp em cái lisp làm việc như sau:
- đánh tên lệnh.
- Chọn điểm điểm cuối (điểm ghi tên thanh thép).
- chọn các điểm đầu ( vị trí các thanh thép).
- ấn phím cách hoặc enter để kết thúc lệnh.
(Chú ý là các đường leader chỉ cần có 2 điểm là điểm đầu điểm cuối, không cần ghi Mtext hay text vì ký hiệu thép em đã có block.)
Cảm ơn các anh!

Không biết bạn vẽ các thanh thép bằng đối tượng gì, tôi hay vẽ bằng Donut nên đã làm theo cách này.
- Chọn điểm chèn
- Chọn các Donut có cùng ký hiệu
- Chèn Leader.
(defun c:ChuThichThep()
(setq Pt0 (getpoint "\nChon diem chen: "))
(prompt "\nChon cac thanh thep can chu thich: ")
(setq ss (ssget '((-4 . "")))
SSLen (sslength ss)
I -1
J -1)
(while (setq DoNut (ssname ss (setq I (1+ I))))
(setq Pt1 (cdr (nth 14 (entget donut)))
Pt2 (cdr (nth 18 (entget donut)))
Dis (distance Pt1 Pt2)
Ang (angle Pt1 Pt2)
Center (polar Pt1 Ang (/ Dis 2))
PtIns (polar Center (angle Center Pt0) Dis))
(command "qleader" PtIns Pt0)
)
)
Lưu ý, setting của qleader có Number of points = 2, Annotation = none
  • 0

#8 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 08 April 2010 - 10:56 AM

Không biết bạn vẽ các thanh thép bằng đối tượng gì, tôi hay vẽ bằng Donut nên đã làm theo cách này.
- Chọn điểm chèn
- Chọn các Donut có cùng ký hiệu
- Chèn Leader.

(defun c:ChuThichThep()
(setq Pt0 (getpoint "\nChon diem chen: "))
(prompt "\nChon cac thanh thep can chu thich: ")
(setq ss (ssget '((-4 . "")))
SSLen (sslength ss)
I -1
J -1)
(while (setq DoNut (ssname ss (setq I (1+ I))))
(setq Pt1 (cdr (nth 14 (entget donut)))
Pt2 (cdr (nth 18 (entget donut)))
Dis (distance Pt1 Pt2)
Ang (angle Pt1 Pt2)
Center (polar Pt1 Ang (/ Dis 2))
PtIns (polar Center (angle Center Pt0) Dis))
(command "qleader" PtIns Pt0)
)
)
Lưu ý, setting của qleader có Number of points = 2, Annotation = none

Cảm ơn anh nhé. Nhưng ý em là điểm đầu mình chọn là điểm gốc, sau đó chọn các điểm tiếp theo là điểm muốn chỉ đến vị trí thanh thép, vì có khi đối tượng là Line, polyline, block chẩng hạn.
ah mà cai lisp của anh em đã chạy thử rồi nó báo lỗi anh ah. như sau:
Command: CHUTHICHTHEP
Chon diem chen:
Chon cac thanh thep can chu thich:
Select objects: 1 found
Select objects: 1 found, 2 total
Select objects: 1 found, 3 total
Select objects: 1 found, 4 total
Select objects: 1 found, 5 total
Select objects:
; error: bad argument type: 2D/3D point: 0
đây là quá trình em thực hiện như lỗi đúng không anh.
Mong anh giup em theo yêu câu trên của em nhé.
  • 0

#9 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 08 April 2010 - 02:19 PM

Tôi chạy không thấy lỗi nào.
Liệu bạn đã thiết lập setting cho lệnh qleader như tôi đã nói chưa?
Ở đây tôi muốn giảm thao tác chọn điểm bằng cách chọn cùng lúc đối tượng.
Nếu bạn muốn chọn theo điểm tôi sẽ sửa lại.
Bây h tôi đang bận, tối nay sẽ giúp bạn.
Thân.
  • 0

#10 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 08 April 2010 - 03:09 PM

Em đã chỉnh như anh nói như nó báo nỗi như trên đấy, anh xem lại giúp em nhé. Và anh sửa như yêu cầu trên hộ em. Và nếu được thì theo em là anh để song song cả 2 cách đấy là:
cho người sử dụng 2 sự lựa chọn: sau khi báo cho người sử dụng biết, là chọn đối tượng, thi thêm vào 1 dòng nữa:
Chọn theo kiểu đối tượng hoặc là theo điểm(D,P)
người sử dụng đáp là kiểu đối tượng thì lại hỏi tiếp:
- chọn đối tượng mẫu (là block hoặc donut) (điểm chọn là điểm chèn của block hoặc là tâm donut).
Nếu đáp là P thì cho người dùng tự tích các điểm.
Chân thành cảm ơn anh. Mong anh sửa dùm.
  • 0

#11 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 08 April 2010 - 10:23 PM

Vừa đi uống về, hơi liêng biêng nhưng sẽ vẫn cố giúp bạn va cũng là để tự trau dồi kiến thức.
Tuy nhiên để khám rõ được bệnh, bạn vui lòng chạy từng đoạn mã của tôi để phát hiện ra lỗi đoạn nào, có thể máy tính của tôi và của bạn có sự khác nhau. Tôi dùng Win7, Cad2007 + Express.
Hẹn bạn khoảng 30p nữa nhé.
  • 0

#12 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 08 April 2010 - 11:10 PM

Em đã chỉnh như anh nói như nó báo nỗi như trên đấy, anh xem lại giúp em nhé. Và anh sửa như yêu cầu trên hộ em. Và nếu được thì theo em là anh để song song cả 2 cách đấy là:
cho người sử dụng 2 sự lựa chọn: sau khi báo cho người sử dụng biết, là chọn đối tượng, thi thêm vào 1 dòng nữa:
Chọn theo kiểu đối tượng hoặc là theo điểm(D,P)
người sử dụng đáp là kiểu đối tượng thì lại hỏi tiếp:
- chọn đối tượng mẫu (là block hoặc donut) (điểm chọn là điểm chèn của block hoặc là tâm donut).
Nếu đáp là P thì cho người dùng tự tích các điểm.
Chân thành cảm ơn anh. Mong anh sửa dùm.

Đây là code cho cả 2 phương pháp, bạn hãy thử xem nhé.
(defun c:ChuThichThep ()
(setq Pt0 (getpoint "\nChon diem chen: ")
I -1 J -1)
(initget 1 "doiTuong Diem")
(setq KeyW (getkword "Hay chon doi tuong hoac diem (doiTuong hoac Diem) "))
(if (= KeyW "doiTuong")
(progn
(prompt "\nChon cac thanh thep can chu thich: ")
(setq ss (ssget '((-4 . "")(0 . "INSERT") (-4 . "OR>")))
SSLen (sslength ss))
(while (setq Ent (ssname ss (setq I (1+ I))))
(if (= (cdr (assoc 0 (entget ent))) "LWPOLYLINE")
(progn
(setq Pt1 (cdr (nth 14 (entget Ent)))
Pt2 (cdr (nth 18 (entget Ent)))
Dis (distance Pt1 Pt2)
Ang (angle Pt1 Pt2)
Center (polar Pt1 Ang (/ Dis 2))
)
)
(setq Center (cdr (assoc 10 (entget ent))))
)
(command "qleader" Center Pt0)
)
)
(progn
(setq LstPoint '())
(while (setq Pt (getpoint "\nChon diem dau: "))
(setq LstPoint (append LstPoint (list Pt)))
)
(if (> (length LstPoint) 0)
(progn
(setq I -1)
(While (setq Center (nth (setq I (1+ I)) LstPoint))
(command "qleader" Center Pt0)
)
)
)
)
)
)

  • 0

#13 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 08 April 2010 - 11:31 PM

Anh ơi em đã test với kiểu nhập là chọn Điểm thì kết quả ok.
Khi kiểm tra với đối tượng là thanh thép tròn là block thì kết quả không đúng anh ah. Theo em thì hình như đối tượng của anh là LWPOLYLINE thì lisp chạy mới đúng, mà thực tế việc em cần đối tượng là BLOCK với điểm trèn là điểm chèn của BLOCK.
Mong anh sửa lại giúp.
Cảm ơn anh rất nhiều.
  • 0

#14 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 08 April 2010 - 11:55 PM

Tôi nghĩ bạn đã biết đôi chút về Lisp nên mới viết như thế, thực ra code đó chưa ổn đâu. Để phù hợp hơn với mọi tình huống thì cần có nhiều lựa chọn nữa.
Nhưng nếu bạn dùng Block để thể hiện thanh thép thì hơi tốn điện.
Để khuyến khích sự tò mò, tôi sẽ không giúp bạn nữa.
Bạn chịu khó vọc nhé.
  • 0

#15 Tue_NV

Tue_NV

    KS Võ Quang Tuệ

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

Đã gửi 09 April 2010 - 05:03 AM

Đây là code cho cả 2 phương pháp, bạn hãy thử xem nhé.
(while (setq Pt (getpoint "\nChon diem dau: "))
(setq LstPoint (append LstPoint (list Pt)))
)
(if (> (length LstPoint) 0)
(progn
(setq I -1)
(While (setq Center (nth (setq I (1+ I)) LstPoint))
(command "qleader" Center Pt0)
)
)
)

Chào bạn hoa35ktxd và bktec84
Tue_NV thấy dòng code trên bạn viết thì việc thể hiện kết quả không trực quan lắm. Thể hiện trong hai vòng lặp while. Có cần thiết phải sử dụng đến 2 vòng while và sử dụng đến biến LstPoint để lấy danh sách điểm trong vòng While thứ nhất, sau đó lại sử dụng vòng lặp while thứ 2 lại lấy toạ độ điểm ở biến Center trong LstPoint ra và vẽ leader. Có cần phải như thế không? Kết quả thực hiện chưa trực quan vì kết thúc lệnh ta mới thấy được "hình hài" của mũi tên.

Chỉ cần 1 vòng lặp while là đủ, không cần sử dụng biến LstPoint và biến Center. Chọn điểm đầu đến đâu -> Vẽ luôn leader đến đấy. Kết quả vừa trực quan, vì khi chọn điểm đầu đến đâu, ta sẽ thấy "hình hài" của mũi tên đến đấy

Bạn thay dòng code tô màu xanh trên bằng đoạn code sau :
(while (setq Pt (getpoint Pt0 "\nChon diem dau: "))
(command "qleader" Pt Pt0)
)

Thử nhé
  • 1

#16 hoa35ktxd

hoa35ktxd

    biết lệnh move

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

Đã gửi 09 April 2010 - 07:02 AM

Cảm ơn Bạn nhiều, bây giờ mới tỉnh ra và nhìn lại, lúc đó tư duy chỉ nghi như khi chọn nhiều đối tượng.
Sửa lại như bạn nhìn rất chuyên nghiệp vì ta sẽ có cái "dây chun" khi chọn điểm.
  • 0

#17 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 09 April 2010 - 08:32 AM

Cảm ơn Bạn nhiều, bây giờ mới tỉnh ra và nhìn lại, lúc đó tư duy chỉ nghi như khi chọn nhiều đối tượng.
Sửa lại như bạn nhìn rất chuyên nghiệp vì ta sẽ có cái "dây chun" khi chọn điểm.

0k cảm ơn các anh trên diễn đàn đã giúp em. Em đã chỉnh sửa lại theo ý của anh TueNV và cũng đã đổi đổi tượng là LWPOLYLINE sang BLOCK và đã thành công.
Một lần nữa xin chân thành cảm ơn.
  • 0

#18 bktec84

bktec84

    biết vẽ arc

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

Đã gửi 09 April 2010 - 10:45 AM

Đây là đoạn code em đã sửa, chạy với điểm chỉ mũi tên là điểm thì chạy Ok. Nhưng với đối tượng là block thì lúc được lúc không. em thấy nó không ổn định, như trình độ của em có hạn không biết sao nó lại như vậy. Mong các anh xem xét và sửa lại dùm em. Chân thành cảm ơn!
(defun c:tday ()
(setq Pt0 (getpoint "\nChon diem chen: ")
I -1 J -1)
(initget 1 "T D")
(setq KeyW (getkword "Hay chon doi tuong hoac diem (doiTuong hoac Diem) "))
(if (= KeyW "T")
(progn
(prompt "\nChon cac thanh thep can chu thich: ")
(setq ss (ssget '((-4 . "")(0 . "INSERT") (-4 . "OR>")))
SSLen (sslength ss))
(while (setq Ent (ssname ss (setq I (1+ I))))
(if (= (cdr (assoc 0 (entget ent))) "BLOCK")
(progn
(setq Pt1 (cdr (nth 14 (entget Ent)))
Pt2 (cdr (nth 18 (entget Ent)))
Dis (distance Pt1 Pt2)
Ang (angle Pt1 Pt2)
Center (polar Pt1 Ang (/ Dis 2))
)
)
(setq Center (cdr (assoc 10 (entget ent))))
)
(command "qleader" Center Pt0)
)
)
(progn
(setq LstPoint '())
(while (setq Pt (getpoint Pt0 "\nChon diem dau: "))
(command "qleader" Pt Pt0)
)
)
)
)
  • 0