Chuyển đến nội dung
Diễn đàn CADViet
  • Thông báo

    • Nguyen Hoanh

      CADViet đã hoàn tất nâng cấp   14/09/2017

      Chào các bạn, CADViet đã hoàn tất việc nâng cấp lên phiên bản mới. Tất cả các chức năng đã hoạt động theo kỳ vọng của ban quản trị. Nếu có vấn đề gì cần phản hồi, các bản post ở đây nhé: Trân trọng, Nguyễn Hoành.
Nguyen Hoanh

Viết Lisp theo yêu cầu

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

duy782006    1.374
Bác nào có thể cho em xin một lisp vẽ cầu thang không?

nhập góc nghiêng (độ), Số bậc ( hay chiều rộng bậc) thì tự vẽ

 

Dữ liệu nhập của bạn bị thiếu:

Ít ra phải là số bậc và chiều rộng bậc hoặc chiều rộng bậc và độ dài cạnh xiên hoặc số bậc và chiều dài cạnh xiê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
Sony2007    85

Bạn nào có thể giúp mình viết lisp với công việc như sau:

- Chọn một đường tròn sẵn có trên bản vẽ, sau đó ghi tọa độ tâm của đường tròn đến 1 vị trí bất kỳ do người dùng chọn.

- Bình thường trong bản vẽ kỹ thuật hay ghi kích thước theo kiểu như sau VD: 3000/2=1500. Khi ghi kích thước theo kiểu này mình thường hay ghi kích thước bằng lệnh Autocad, sau đó edit nội dung của kích thước. Mà trong bản vẽ xây dựng thường rất hay dùng.

Cám ơn các bạn 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
ssg    1.088
...lisp đếm tất cả các hình tròn và hình lục giác trong bản vẽ.

Lisp có 2 lệnh : 1/ đếm hình tròn, 2/ đếm hình lục giác.

Khi nhập lệnh 1 hoặc 2 thì yêu cầu nhập R (Đối với hình lục giác R là Bk đường tròn ngoại tiếp)

(nếu được thì có thêm phần mở rộng là : khi đếm xong, yêu cầu pick điểm chèn, chọn điểm chèn sẽ có một text ghi số hình vừa đếm = số)

Cám ơn

1) @vndes: bạn nêu còn thiếu 1 điều kiện. Pline không được chứa bất kỳ một cung tròn nào: code (42 . 0). Nếu không, hình tam giác có 3 góc bo tròn cũng sẽ... bị xem là lục giác!

 

2) @leolas: bạn thử code dưới đây trong nhiều trường hợp khác nhau xem có lỗi gì không? Riêng phần ghi kết quả, bạn không nói rõ quy cách ghi như thế nào. Ví dụ: chương trình đếm đuợc 3 hình tròn có bán kính r= 5.0 thì ghi:

- 3 ?

- Circles = 3 ?

- There are 3 circles with radius = 5.0 ?

-...?

- Cỡ chữ, font chữ?

 

Nhưng nói chung phần ghi kết quả rất đơn giản, nếu bạn biết một chút về lisp sẽ tự làm được. Bạn có thể sử dụng 3 giá trị nhận được trong các biến sau và trình bày text theo ý thích:

- ctyp: loại

- r: bán kính

- n: số lượng đếm được

 

;;;--------------------------------------------------------------------------------------
(defun countCir(r / ss) ;;;Count all circles with radius r
(setq ss (ssget "X" (list (cons 0 "CIRCLE") (cons 40 r))))
(if ss (sslength ss) 0)
)
;;;--------------------------------------------------------------------------------------
(defun countHex(r / ss1 ss2 e re) ;;;Count all hexagons are inscribed by circles with radius r
(setq ss1 (ssget "X" 
   (list
       (cons 0 "LWPOLYLINE") (cons 90 6) (cons 70 1)
       (cons -4 "")
   ))
)
(setq ss2 (ssadd))
(vl-load-com)
(while (setq e (ssname ss1 0))
   [color="#FF0000"](setq re (vlax-curve-getDistAtParam e 1))[/color]
   (if (equal r re 0.00000001) (setq ss2 (ssadd e ss2)))
   (ssdel e ss1)
)
(if ss2 (sslength ss2) 0)
)
;;;===============================================
(defun C:CCH( / r) ;;;Count Circles or Hexagons
(initget "C H")
(setq
   ctyp (getkword "\ncount Circles or Hexagons :")
   r (getreal "\nRadius:")
)
(if (not ctyp) (setq ctyp "C"))
(if (= ctyp "C") (setq n (countCir r )) (setq n (countHex r)))
(alert (strcat "\nType = " ctyp "\t\tRadius = " (rtos r) "\tCount = " (itoa n)))
)
;;;===============================================

 

Chú ý:

- Chương trình chỉ áp dụng cho các hình lục giác đều được tạo nên bởi lệnh Polygon hoặc lệnh Pline với tùy chọn c (close)

- Các hình lục giác bị explode, nằm trong block hoặc đã biến thành region sẽ không được tính

- Dòng code màu đỏ ssg mới sửa lại cho gọn hơn so với lần post trước

Chỉnh sửa theo ssg

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
ssg    1.088
Bạn nào có thể giúp mình viết lisp với công việc như sau:

- Chọn một đường tròn sẵn có trên bản vẽ, sau đó ghi tọa độ tâm của đường tròn đến 1 vị trí bất kỳ do người dùng chọn.

- Bình thường trong bản vẽ kỹ thuật hay ghi kích thước theo kiểu như sau VD: 3000/2=1500. Khi ghi kích thước theo kiểu này mình thường hay ghi kích thước bằng lệnh Autocad, sau đó edit nội dung của kích thước. Mà trong bản vẽ xây dựng thường rất hay dùng.

Cám ơn các bạn nhé

1) Tại sao bạn không dùng lệnh dimordinate? Không nhất thiết phải là tâm đường tròn mà tọa độ của 1 điểm bất kỳ bạn pick trên màn hình

 

2) Với lệnh dim, sau khi pick 2 điểm bạn gõ M, cho phép edit luôn một thể. Dùng lisp cũng không hơn gì!

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
leolas    133
2) @leolas: bạn thử code dưới đây trong nhiều trường hợp khác nhau xem có lỗi gì không? Riêng phần ghi kết quả, bạn không nói rõ quy cách ghi như thế nào.

Cám ơn 2 lisp của bác "ssg" và "duy782006". Đã text thử ở nhiều trường hợp, chạy tốt. Nhờ có nó công việc của em đã nhanh hơ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
laichauc45    1

tôi cúng là một dân trong kỹ thuật nên CAD là điều không thể thiếu được nhưng công việc của tôi đôi khi phải chuyển bản vẽ cho người khác (cho nên cần tính bảo mất cho bản vẽ vì dùnh PDF thì cũng bất tiện )vậy có bác nào giúp hộ tôi viết lisp có thể phá tất cả các đối tượng thành các nét nhỏ được không.

2- tôi có 1 thư viện các chi tiết liên quan đến ngành của tôi và tôi muốn có 1 lisp ( hoạc 1 chương trình ) chỉ cấn gõ tên chi tiết đó là nó có thể hiện lên chi tiết đó trong dấu nháp của con chỏ ( ngày xưa tôi đã dùng rồi nhưng do hỏng máy nên mất cái này mà đi xin thì giờ không biết xin ai) nhờ các bác giúp đỡ 1 tay 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
Sony2007    85
1) Tại sao bạn không dùng lệnh dimordinate? Không nhất thiết phải là tâm đường tròn mà tọa độ của 1 điểm bất kỳ bạn pick trên màn hình

 

2) Với lệnh dim, sau khi pick 2 điểm bạn gõ M, cho phép edit luôn một thể. Dùng lisp cũng không hơn gì!

 

1. Vì mình có 1 bản vẽ cần xác định tọa độ tâm của nhiều đường tròn, giá trị của tâm đường tròn sẽ ghi vào ở vị trí cách tâm mỗi đường tròn 1 giá trị X, Y nào đó. Nếu dụng lệnh dimmordinate thì phải làm thủ công cứ mỗi lần chọn bắt điểm và lại phải chỉ vị trí cho nó. Như thế rất lâu.

 

2. Thường mình vẽ hết toàn bộ các hình xong, sau đó bố trí và ghi kích thước. Chỉ việc gõ lệnh và pick điểm để ghi kích thước thật cho mỗi hình vẽ, không bao giờ phải gõ "M" để ghi text cho bản vẽ nữa vì như thế rất lâu.

 

Cám ơn bác SSG nhé, vì lần trước em chỉ nêu chung chung mà không nói rõ cụ thể. Bác SSG, anh em nào xem có thể giúp mình không ?

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
ssg    1.088
tôi cúng là một dân trong kỹ thuật nên CAD là điều không thể thiếu được nhưng công việc của tôi đôi khi phải chuyển bản vẽ cho người khác (cho nên cần tính bảo mất cho bản vẽ vì dùnh PDF thì cũng bất tiện )vậy có bác nào giúp hộ tôi viết lisp có thể phá tất cả các đối tượng thành các nét nhỏ được không.

2- tôi có 1 thư viện các chi tiết liên quan đến ngành của tôi và tôi muốn có 1 lisp ( hoạc 1 chương trình ) chỉ cấn gõ tên chi tiết đó là nó có thể hiện lên chi tiết đó trong dấu nháp của con chỏ ( ngày xưa tôi đã dùng rồi nhưng do hỏng máy nên mất cái này mà đi xin thì giờ không biết xin ai) nhờ các bác giúp đỡ 1 tay nhé

1) Bạn dùng thử chương trình này. Cung cách hoạt động của CT như sau:

- User chọn vùng cần xử lý, trong phạm vi hình chữ nhật được xác định bằng 2 điểm pick

- CT explode toàn bộ các blocks

- Explode toàn bộ các pline (thành line và arc)

- CT không split arc, circle và spline (nếu làm sẽ gãy khúc, in ra không coi được!)

- Split line thành từng segments có chiều dài do người dùng chọn. Lưu ý: trị số này càng nhỏ, số lượng segment càng lớn -> thời gian chạy CT lâu hơn và kích thước file cũng lớn lên theo tương ứng. Trị số trong cặp dấu móc nhọn là do CT tính và đề nghị = 1/100 khoảng cách 2 điểm pick khi user chọn vùng (nếu đồng ý chỉ Enter)

- Purge toàn bộ các block

 

;;;----------------------------------------------------------------------------------
(defun expall (ss / e) ;;;Explode all entities in ss
(while (setq e (ssname ss 0))
   (command "explode" e)
   (ssdel e ss)
)
)
;;;----------------------------------------------------------------------------------
(defun splite(e x / d lay col p1 p2 L a n) ;;;Convert a line to segments
(setq
   d (entget e)
   lay (cdr (assoc 8 d))
   col (cdr (assoc 62 d))
   p1 (cdr (assoc 10 d))
   p2 (cdr (assoc 11 d))
   L (distance p1 p2)
   a (angle p1 p2)
   n (fix (/ L x))
)
(if (= n 0) (setq n 1))
(setq x (/ L n))
(if (null col) (setq col "BYLAYER"))
(setvar "clayer" lay)
(command "color" col)
(repeat n
   (command "line" p1 (polar p1 a x) "")
   (setq p1 (getvar "lastpoint"))
)
(entdel e)
)
;;;=============================================
(defun C:SS( / p1 p2 di x0 x oldos ss nL i e per) ;;;Split selected objects to Segments
(prompt "\nSelect objects in a window, specified by 2 points...")
(setq
   p1 (getpoint "\nFirst corner:")
   p2 (getcorner p1 "\nOpposite corner:")
   di (distance p1 p2)
   x0 (fix (/ di 100))
   x (getreal (strcat "\nLength of segments <" (itoa x0) " >:"))
   oldos (getvar "osmode")
)
(if (null x) (setq x x0))
(setvar "osmode" 0)
(setvar "cmdecho" 0)
(while (setq ss (ssget "w" p1 p2 '((0 . "INSERT")))) (expall ss))
(while (setq ss (ssget "w" p1 p2 '((0 . "LWPOLYLINE")))) (expall ss))
(setq
   ss (ssget "w" p1 p2  '((0 . "LINE")))
   nL (sslength ss)
   i -1
)
(repeat nL
   (setq
       i (1+ i)
       e (ssname ss i)
       per (fix (+ (* (/ (float i) nL) 100) 0.5))
   )
   (splite e x)
   (setvar "cmdecho" 1)
   (princ (strcat "\n" (itoa per) "% objects had been splited"))
   (setvar "cmdecho" 0)    
)
(command "purge" "a" "*" "n")
(setvar "osmode" oldos)
(setvar "cmdecho" 1)
(alert "\nFinish!")
)
;;;=============================================

 

2) Theo bạn mô tả thì đó là insert block. Bạn thử dùng lệnh adcenter (AutoCAD Design Center, bấm Ctrl+2) bao giờ chưa? Cái này đúng yêu cầu của bạn, cần gì đến lisp.

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

EM TÌM ĐƯỢC DOẠN CODE TÍNH GIÁ TRỊ TRUNG BÌNH. NHƯNG MÀ HÌNH NHƯ NÓ BỊ LỖI, CHẠY KHÔNG ĐƯỢC. CÁC CAO THỦ VÀO XEM SỬA GIÚP EM VỚI. THANKS

 

;Tinh gia tri trung binh cac so chon

;*************************************************************************

(defun C:tb (/ cnt enam ent pnt s1 tot v1 val)

(setvar "CMDECHO" 0)

(prompt "\nChon cac so de tinh: ")

(setq s1 (ssget))

(prompt "\nDiem dat ket qua: ")

(setq pnt (getpoint))

(setvar "cmdecho" 0)

(setq tot 0)

(if s1

(progn

(setq cnt (1- (sslength s1)))

(while (>= cnt 0)

(setq enam (ssname s1 cnt))

(setq ent (entget enam))

(if (= (cdr (assoc 0 ent)) "TEXT")

(progn

(setq v1 (assoc 1 ent))

(setq val (atof (cdr v1)))

(if (and (numberp val) (/= val 0))

(progn

(setq tot (+ val tot))

)

)

)

)

(setq cnt (1- cnt))

))

)

(setq tot (/ tot (sslength s1)))

(setq tot (rtos tot 2))

(command "text" pnt "" tot)

(princ)

(setvar "cmdecho" 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
duy782006    1.374
EM TÌM ĐƯỢC DOẠN CODE TÍNH GIÁ TRỊ TRUNG BÌNH. NHƯNG MÀ HÌNH NHƯ NÓ BỊ LỖI, CHẠY KHÔNG ĐƯỢC. CÁC CAO THỦ VÀO XEM SỬA GIÚP EM VỚI. THANKS

 

 

Cái này làm việc đó được nè. Còn bây giờ hơi bận nên không sửa đoạn của bạn được

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun TB ()

(setq TBSUM 0)

(Princ "\nHay chon cac so can tinh :")

(setq TBSS (ssget '((0 . "TEXT"))))

(setq iTB 0)

(setq NTB (sslength TBss))

(while (< iTB NTB)

(setq TBDT (ssname TBSS iTB))

(setq TBDT (entget TBDT))

(setq TBTEXT (cdr (assoc 1 TBDT)))

(setq TBSUM1 (atof TBTEXT))

(setq TBSUM (+ TBSUM (* TBSUM1 1)))

(setq iTB (1+ iTB))

)

(setq TONG1TB (/ TBSUM ITB))

(setq dlcTB (dnint "\nNhap do cao chu "dccvTB1))

(setq dccvTB1 dlcTB)

(setq PTTB (getpoint "\nChon diem muon viet ket qua :"))

(setq TONG2 (rtos TONG1TB 2 2))

(luuos)

(setvar "osmode" 0)

(command "text" "j" "r" PTTB dlcTB "0" TONG2 "")

(traos)

(setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** PHAM QUOC DUY - BINH SON - QUANG NGAI")

(Princ)

)

 

;;----------

(defun luuos ()

(setq

DUY_OSMODE (getvar "OSMODE")

DUY_AUTOSNAP (getvar "AUTOSNAP")

DUY_LAYERHH (getvar "CLAYER")

DUY_THANGXEOHH (getvar "ORTHO")

DUY_filletrad (getvar "FILLETRAD")

DUY_TEXTSTYLE (getvar "TEXTSTYLE")

)

)

(defun traos ()

(if DUY_OSMODE

(setvar "OSMODE" DUY_OSMODE)

)

(if DUY_LAYERHH

(setvar "CLAYER" DUY_LAYERHH)

)

(if DUY_THANGXEOHH

(setvar "ORTHO" DUY_THANGXEOHH)

)

(if DUY_AUTOSNAP

(setvar "AUTOSNAP" DUY_AUTOSNAP)

)

(if DUY_filletrad

(setvar "FILLETRAD" DUY_filletrad)

)

(if DUY_TEXTSTYLE

(setvar "TEXTSTYLE" DUY_TEXTSTYLE)

)

 

 

)

;;----------

;---------------------

(defun dnint (prompt def / temp)

(if def

(setq temp (getreal (nstr prompt def)))

(setq def (getreal (nstr1 prompt)))

);if def

(if temp

(setq def temp)

def

);if temp

);defun nint

;--------------------

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
Bạn có thể post yêu cầu về autolisp ở topic này.

các Bác ơi !

em biết autocad từ lâu ròai ....? :) Nhưng lại ko biết lisp...... :)

vậy nay em kính mong các Bác chỉ dùm em ! :)

em cảm ơn nhiều 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
vinataba    3

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun TB ()

(setq TBSUM 0)

(Princ "\nHay chon cac so can tinh :")

(setq TBSS (ssget '((0 . "TEXT"))))

(setq iTB 0)

(setq NTB (sslength TBss))

(while (< iTB NTB)

(setq TBDT (ssname TBSS iTB))

(setq TBDT (entget TBDT))

(setq TBTEXT (cdr (assoc 1 TBDT)))

(setq TBSUM1 (atof TBTEXT))

(setq TBSUM (+ TBSUM (* TBSUM1 1)))

(setq iTB (1+ iTB))

)

(setq TONG1TB (/ TBSUM ITB))

(setq dlcTB (dnint "\nNhap do cao chu "dccvTB1))

(setq dccvTB1 dlcTB)

(setq PTTB (getpoint "\nChon diem muon viet ket qua :"))

(setq TONG2 (rtos TONG1TB 2 2))

(luuos)

(setvar "osmode" 0)

(command "text" "j" "r" PTTB dlcTB "0" TONG2 "")

(traos)

(setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** PHAM QUOC DUY - BINH SON - QUANG NGAI")

(Princ)

)

 

;;----------

(defun luuos ()

(setq

DUY_OSMODE (getvar "OSMODE")

DUY_AUTOSNAP (getvar "AUTOSNAP")

DUY_LAYERHH (getvar "CLAYER")

DUY_THANGXEOHH (getvar "ORTHO")

DUY_filletrad (getvar "FILLETRAD")

DUY_TEXTSTYLE (getvar "TEXTSTYLE")

)

)

(defun traos ()

(if DUY_OSMODE

(setvar "OSMODE" DUY_OSMODE)

)

(if DUY_LAYERHH

(setvar "CLAYER" DUY_LAYERHH)

)

(if DUY_THANGXEOHH

(setvar "ORTHO" DUY_THANGXEOHH)

)

(if DUY_AUTOSNAP

(setvar "AUTOSNAP" DUY_AUTOSNAP)

)

(if DUY_filletrad

(setvar "FILLETRAD" DUY_filletrad)

)

(if DUY_TEXTSTYLE

(setvar "TEXTSTYLE" DUY_TEXTSTYLE)

)

 

 

)

;;----------

;---------------------

(defun dnint (prompt def / temp)

(if def

(setq temp (getreal (nstr prompt def)))

(setq def (getreal (nstr1 prompt)))

);if def

(if temp

(setq def temp)

def

);if temp

);defun nint

;--------------------

 

Bạn ơi xem lại cho mình cái này với, nó không chạy được. thanks

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
duy782006    1.374
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

(Defun c:TB ()

(setq TBSUM 0)

(Princ "\nHay chon cac so can tinh :")

(setq TBSS (ssget '((0 . "TEXT"))))

(setq iTB 0)

(setq NTB (sslength TBss))

(while (< iTB NTB)

(setq TBDT (ssname TBSS iTB))

(setq TBDT (entget TBDT))

(setq TBTEXT (cdr (assoc 1 TBDT)))

(setq TBSUM1 (atof TBTEXT))

(setq TBSUM (+ TBSUM (* TBSUM1 1)))

(setq iTB (1+ iTB))

)

(setq TONG1TB (/ TBSUM ITB))

(setq dlcTB (dnint "\nNhap do cao chu "dccvTB1))

(setq dccvTB1 dlcTB)

(setq PTTB (getpoint "\nChon diem muon viet ket qua :"))

(setq TONG2 (rtos TONG1TB 2 2))

(luuos)

(setvar "osmode" 0)

(command "text" "j" "r" PTTB dlcTB "0" TONG2 "")

(traos)

(setvar "MODEMACRO" "**CHUC BAN LAM VIEC HIEU QUA** PHAM QUOC DUY - BINH SON - QUANG NGAI")

(Princ)

)

 

;;----------

(defun luuos ()

(setq

DUY_OSMODE (getvar "OSMODE")

DUY_AUTOSNAP (getvar "AUTOSNAP")

DUY_LAYERHH (getvar "CLAYER")

DUY_THANGXEOHH (getvar "ORTHO")

DUY_filletrad (getvar "FILLETRAD")

DUY_TEXTSTYLE (getvar "TEXTSTYLE")

)

)

(defun traos ()

(if DUY_OSMODE

(setvar "OSMODE" DUY_OSMODE)

)

(if DUY_LAYERHH

(setvar "CLAYER" DUY_LAYERHH)

)

(if DUY_THANGXEOHH

(setvar "ORTHO" DUY_THANGXEOHH)

)

(if DUY_AUTOSNAP

(setvar "AUTOSNAP" DUY_AUTOSNAP)

)

(if DUY_filletrad

(setvar "FILLETRAD" DUY_filletrad)

)

(if DUY_TEXTSTYLE

(setvar "TEXTSTYLE" DUY_TEXTSTYLE)

)

 

 

)

;;----------

;---------------------

(defun dnint (prompt def / temp)

(if def

(setq temp (getreal (nstr prompt def)))

(setq def (getreal (nstr1 prompt)))

);if def

(if temp

(setq def temp)

def

);if temp

);defun nint

;--------------------

Bạn ơi xem lại cho mình cái này với, nó không chạy được. thanks

 

Xin lổi ! Đã sửa (dòng màu đỏ ấy)

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
ssg    1.088
vẫn chưa được bạn ạ. chạy nó báo lỗi

 

Select objects: ; error: no function definition: NSTR1

 

bạn giúp mình với. Thanks

Mình sẽ giúp bạn, nhưng trước hết vui lòng trả lời câu hỏi:

Bạn tập viết lisp hay chỉ cần chương trình để sử dụng?

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
vinataba    3
Mình sẽ giúp bạn, nhưng trước hết vui lòng trả lời câu hỏi:

Bạn tập viết lisp hay chỉ cần chương trình để sử dụng?

 

Cảm ơn bạn SSG, Mình cần cái này để dùng.

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
Sony2007    85
1) Tại sao bạn không dùng lệnh dimordinate? Không nhất thiết phải là tâm đường tròn mà tọa độ của 1 điểm bất kỳ bạn pick trên màn hình

 

2) Với lệnh dim, sau khi pick 2 điểm bạn gõ M, cho phép edit luôn một thể. Dùng lisp cũng không hơn gì!

 

1. Em có 1 bản vẽ cần xác định tọa độ tâm của nhiều đường tròn, giá trị của tâm đường tròn sẽ ghi vào ở vị trí cách tâm mỗi đường tròn 1 giá trị X, Y nào đó. Nếu dụng lệnh dimmordinate thì phải làm thủ công cứ mỗi lần chọn mỗi đường tròn, sau đó bắt điểm và lại phải chỉ vị trí cho nó. Như thế rất lâu.

 

2. Giả sử như mình có một đoạn thẳng có chiều dài là 1500. Khi ghi kích thước thì mình lại muốn thể hiện là 3000/2=1500. Có cách nào dùng Lisp để ghi tự động không. Vì có trường hợp trong 1 bản vẽ có nhiều kích thước phải ghi như vậy, nếu dùng lệnh "ed" hoặc là "m" khi dim thì có nhiều lúc bỏ sót quên ghi thì làm sao được

 

Đây là forum viết lisp theo yêu cầu sao minh không thấy có ai giúp 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
ssg    1.088
1. Em có 1 bản vẽ cần xác định tọa độ tâm của nhiều đường tròn, giá trị của tâm đường tròn sẽ ghi vào ở vị trí cách tâm mỗi đường tròn 1 giá trị X, Y nào đó. Nếu dụng lệnh dimmordinate thì phải làm thủ công cứ mỗi lần chọn mỗi đường tròn, sau đó bắt điểm và lại phải chỉ vị trí cho nó. Như thế rất lâu.

 

2. Giả sử như mình có một đoạn thẳng có chiều dài là 1500. Khi ghi kích thước thì mình lại muốn thể hiện là 3000/2=1500. Có cách nào dùng Lisp để ghi tự động không. Vì có trường hợp trong 1 bản vẽ có nhiều kích thước phải ghi như vậy, nếu dùng lệnh "ed" hoặc là "m" khi dim thì có nhiều lúc bỏ sót quên ghi thì làm sao được

 

Đây là forum viết lisp theo yêu cầu sao minh không thấy có ai giúp cả nhỉ

Lý do là ở bạn! Yêu cầu bạn nêu lần trước khác với lần này (chỉ chọn 1 đường tròn). Lập trình viên chỉ có hứng thú lập trình khi họ thấy rõ ý nghĩa công việc mình làm có giá trị sử dụng thiết thực. Một đường tròn tất nhiên là dễ viết hơn nhiều đường tròn, nhưng "nhiều" cho thấy tính "chính đáng" của yêu cầu hơn là "một"!

Ngay cả lần này, ý nghĩa thì đã rõ, nhưng yêu cầu thì chưa rõ lắm:

1) Giá trị X, Y nào đó được lấy từ đâu? Người dùng tùy chọn hay là quy định thống nhất từ trước? Chẳng hạn, lấy h = textheight hiện hành làm chuẩn thì X, Y bằng bao nhiêu so với h? Hình thức ghi như thế nào? Ví dụ với X= 10.5; Y=15.6 thì ghi là "X10.5 Y15.6" hay là kiểu nào khác?

2) Dạng 3000/2=1500 thì hiểu rồi. Nhưng lần trước bạn nói ví dụ, có nghĩa là sẽ có dạng 3000/3 = 1000, 3000/4 = 750...? "Ví dụ như" và "luôn luôn có dạng" khác nhau hoàn toàn!

3) Bạn cân nhắc thêm ý này nữa: tạo lệnh mới để ghi kích thước dạng 3000/2=1500 hay là cứ ghi bình thường, sau đó dùng lệnh (cho phép chọn hàng loạt đối tượng dimensions) để convert toàn bộ chúng theo dạng trên? Cái nào tiện dụng cho bạn hơn?

Có thể bạn chưa hiểu nhiều về lập trình, nhưng buộc bạn phải hiểu các yêu cầu cần và đủ để một bài toán bất kỳ có được lời giải chứ? Chương trình luôn luôn có tính máy móc, nghĩa là mọi cái phải rõ ràng, cụ thể đến từng chi tiết nhỏ nhặt nhất. Một chương trình gọi là "thông minh", có khả năng tùy biến linh hoạt, thực chất cũng là mang tính máy móc ở mức độ tinh vi hơn mà thôi. Chương trình không thể hiểu được khái niệm "một giá trị x, y nào đó"!

Bạn bổ sung thật rõ yêu cầu thì chắc chắn sẽ có bài giải!

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

các bác ơi bản vẽ của mình có rất nhiều dim đã bị modify, có bác nào có lisp trả về kích thước đúng trong acad 2007 thì cho mình xin, mình đang rất cần, thanks!!

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
Nguyen Hoanh    4.524
các bác ơi bản vẽ của mình có rất nhiều dim đã bị modify, có bác nào có lisp trả về kích thước đúng trong acad 2007 thì cho mình xin, mình đang rất cần, thanks!!

Dùng lệnh DIMEDIT rồi chọn tham số New

 

Nhấn OK luôn nếu ACAD hiện ra bảng còn không thì gõ enter luôn.

Sau đó chọn các dim là xong.

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
thoclep    143
các bác ơi bản vẽ của mình có rất nhiều dim đã bị modify, có bác nào có lisp trả về kích thước đúng trong acad 2007 thì cho mình xin, mình đang rất cần, thanks!!

Dung lenh "dimreassoc"

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
ngayve324    270
các bác ơi bản vẽ của mình có rất nhiều dim đã bị modify, có bác nào có lisp trả về kích thước đúng trong acad 2007 thì cho mình xin, mình đang rất cần, thanks!!

mình thì hay dung cách này. cứ ED rùi gõ <> là ra đúng kích thước thực. hix nông dân quá

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
Sony2007    85
Lý do là ở bạn! Yêu cầu bạn nêu lần trước khác với lần này (chỉ chọn 1 đường tròn). Lập trình viên chỉ có hứng thú lập trình khi họ thấy rõ ý nghĩa công việc mình làm có giá trị sử dụng thiết thực. Một đường tròn tất nhiên là dễ viết hơn nhiều đường tròn, nhưng "nhiều" cho thấy tính "chính đáng" của yêu cầu hơn là "một"!

Ngay cả lần này, ý nghĩa thì đã rõ, nhưng yêu cầu thì chưa rõ lắm:

1) Giá trị X, Y nào đó được lấy từ đâu? Người dùng tùy chọn hay là quy định thống nhất từ trước? Chẳng hạn, lấy h = textheight hiện hành làm chuẩn thì X, Y bằng bao nhiêu so với h? Hình thức ghi như thế nào? Ví dụ với X= 10.5; Y=15.6 thì ghi là "X10.5 Y15.6" hay là kiểu nào khác?

2) Dạng 3000/2=1500 thì hiểu rồi. Nhưng lần trước bạn nói ví dụ, có nghĩa là sẽ có dạng 3000/3 = 1000, 3000/4 = 750...? "Ví dụ như" và "luôn luôn có dạng" khác nhau hoàn toàn!

3) Bạn cân nhắc thêm ý này nữa: tạo lệnh mới để ghi kích thước dạng 3000/2=1500 hay là cứ ghi bình thường, sau đó dùng lệnh (cho phép chọn hàng loạt đối tượng dimensions) để convert toàn bộ chúng theo dạng trên? Cái nào tiện dụng cho bạn hơn?

Có thể bạn chưa hiểu nhiều về lập trình, nhưng buộc bạn phải hiểu các yêu cầu cần và đủ để một bài toán bất kỳ có được lời giải chứ? Chương trình luôn luôn có tính máy móc, nghĩa là mọi cái phải rõ ràng, cụ thể đến từng chi tiết nhỏ nhặt nhất. Một chương trình gọi là "thông minh", có khả năng tùy biến linh hoạt, thực chất cũng là mang tính máy móc ở mức độ tinh vi hơn mà thôi. Chương trình không thể hiểu được khái niệm "một giá trị x, y nào đó"!

Bạn bổ sung thật rõ yêu cầu thì chắc chắn sẽ có bài giải!

 

Sau đây là những bổ sung của em:

1. Cần xác định tọa độ tâm của nhiều đường tròn trong 1 bản vẽ, các đường tròn này có bán kính khác nhau. Giá trị của tâm đường tròn sẽ ghi vào ở vị trí cách tâm mỗi đường tròn 1 giá trị X, Y. Chiều cao chữ để ghi textheight= h, giá trị X= Y = 0.5h. Giá trị h do người dùng tự nhập vào. Các giá trị tâm đường tròn sẽ ghi dạng "x=....; y= ...."

2. Dạng ghi kích thước của em là 3000/2=1500. Lệnh này có 2 hình thức là ghi bình thường, và convert những kích thước lỡ đã bị ghi rồi.

 

Vì công việc nên em rất cần những cái này, bác gắng giúp em với nhé. Cám ơn bác SSG 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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×