Chuyển đến nội dung
Diễn đàn CADViet
Đăng nhập để thực hiện theo  
bktec84

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

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

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.com/upfiles/2/diemtam.jpg

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
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.com/upfiles/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.

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

Trong Cad có sẵn lẹnh "qleader" rồi mà, chọn setting để thiết lập các lựa chọ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
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ả.

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

diemtam.jpg

 

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.

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à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!

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

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

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

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

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.

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

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

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

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

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.

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

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
Đâ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é

  • Vote tăng 1

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

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

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

Đâ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)

)

)

)

)

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
Đăng nhập để thực hiện theo  

×