Chuyển đến nội dung
Diễn đàn CADViet
Nguyen Hoanh

Viết lisp theo yêu cầu [phần 2]

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

Mình có ý tưởng thế này

Khi xuất ra trắcc dọc nova góc nó ra kết quả thế này

vd : đoạn cong A=16d41'29'' hoặc không cong 16d41'29''

khi hoàn thiện ta phải cộng thêm 180d hoặc trừ đi 180d sẽ ra 196d41'29'' hoặc 163d18'31''.muốn có kQ này ta phải ra excell thực thiện.

các bạn giúp mình viết lisp này với.cái này khó quá>

mình viết cho bạn cái lisp 180+ trước. còn lệnh 180- hơi dài dòng loằng ngoằng chút nên mình ngại :D

(defun c:180+ (/ goc val do res)
(setq goc (entsel "chon goc muon sua")
			val (substr (cdr (assoc 1 (entget (car goc)))) 3)
			do (atoi val)
			val (strcat "A="(rtos (+ 180 do) 2 0) (substr val (1+ (strlen (rtos do 2 0)))))
			RES (entget (car goc)))
 (entmod (subst (cons 1 val) (assoc 1 RES) RES)))

bạn nghiên cứu code mình viết để tự viết cái lệnh còn lại nhé.

PS: nhưng mình thấy hình như bạn hơi cầu toàn khi sửa cái góc đó. mình đi làm mấy năm rồi cũng chưa gặp trường hợp nào bị yêu cầu phải sửa cái góc nà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

Em tìm kiếm trên diễn đàn rồi nhưng không có cái nào đúng việc mình cần nên nhờ các bác, mong các bác giúp hoặc tìm giúp cũng được.

Cụ thể như thế này: Em cần một lisp thực hiện lệnh sẽ yêu cầu chọn đối tượng Text sẽ cho biết được Current Width Factor của đối tượng text đó và yêu cầu nhập Width Factor mới, sẽ áp dụng Width Factor mới cho đối tượng cần điều chỉnh.

Thanks các bác 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
mình viết cho bạn cái lisp 180+ trước. còn lệnh 180- hơi dài dòng loằng ngoằng chút nên mình ngại :D

(defun c:180+ (/ goc val do res)
(setq goc (entsel "chon goc muon sua")
			val (substr (cdr (assoc 1 (entget (car goc)))) 3)
			do (atoi val)
			val (strcat "A="(rtos (+ 180 do) 2 0) (substr val (1+ (strlen (rtos do 2 0)))))
			RES (entget (car goc)))
 (entmod (subst (cons 1 val) (assoc 1 RES) RES)))

bạn nghiên cứu code mình viết để tự viết cái lệnh còn lại nhé.

1 nguyên tắc viết Lisp mà Tue_NV muốn góp ý cho Thaistreetz là : Khi viết Lisp nên áp dụng cho 1 trường hợp Tổng Quát , tức là mọi trường hợp, cộng trừ số đo góc đều có thể áp dụng được nó chứ không riêng gì góc có số đo 180độ (áp dụng đúng cho trường hợp góc có AdB'C"

 

Góp thêm 1 ý nữa cho chuỗi viết Lisp theo nguyên tắc :

Viết sao cho Tổng quát áp dụng được cho mọi trường hợp -> hình thành nên 1 tư duy khái quát được vấn đề

- viết càng đơn giản càng tốt nhưng phải áp dụng được cho trường hợp Tổng Quát

Mình không biết cái này dùng vào việc gì, tuy nhiên tò mò lên mình dùng thử và mình thấy nó quá loằng ngoằng, quá phức tạp để nhận được kết quả.

ko biết bạn thế nào. còn mình, mình viết lisp theo nguyên tắc sau:

- viết càng ngắn càng tốt

- viết càng đơn giản càng tốt

- viết càng ít bước nhập số liệu càng tốt

- sử dụng càng ít hộp thoại càng tốt

- viết để khi sử dụng càng ít bước phải rời tay phải khỏi con chuột để nhập số liệu càng tốt

- viết để cho người sử dụng càng dễ hình thành thói quen khi chạy lệnh càng tốt.

.....

Mấy lời góp ý

Tue_NV

  • 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
Em tìm kiếm trên diễn đàn rồi nhưng không có cái nào đúng việc mình cần nên nhờ các bác, mong các bác giúp hoặc tìm giúp cũng được.

Cụ thể như thế này: Em cần một lisp thực hiện lệnh sẽ yêu cầu chọn đối tượng Text sẽ cho biết được Current Width Factor của đối tượng text đó và yêu cầu nhập Width Factor mới, sẽ áp dụng Width Factor mới cho đối tượng cần điều chỉnh.

Thanks các bác nhiều

Bạn thử Lisp thay đổi Width Factor của Text

(defun C:cwf(/ cwfactor ent obj ss val);Chang Width Factor
 (vl-load-com)
 (princ "\nChon Text can thay doi Width Factor : ")
 (while (setq ss (ssget "+.:S:N" (list (cons 0 "TEXT"))))
   (setq ent (ssname ss 0))
   (setq obj (vlax-ename->vla-object ent)
  cwF (vla-get-ScaleFactor obj))
   (initget 6)
   (setq val (getreal (strcat "\nInput new Width Factor <" (rtos cwF) "> :" )))
   (if (and val (/= val cwF))
     (vla-put-ScaleFactor obj val))
   (princ "\nChon Text can thay doi Width Factor : ")    )
 (princ ))

  • 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

Chào các anh em trên điễn đàn!

Công ty mình trước kia hay dùng font vnsimli.shx Nhưng bây giừ lại chuyển toàn bộ sang dùng arial. Toàn bộ những mẫu chi tiết điển hình của mình bây mà ngồi đánh lại thì mệt chết mất. Mình đã dùng list chuyển font trên diễn đàn rồi nhưng vấn đề mình gặp ở đây là : Khi mình chuyển từ vnsimli.shx sang arial thì font mới là chữ bình thường. Mình muốn là chữ in hoa thì bản vẽ mới đẹp. Rất mong các bạn giúp đỡ.

Đây là file minh hoạ :

http://www.cadviet.com/upfiles/3/font.dwg

List minh dùng :

http://www.cadviet.com/upfiles/3/t2u.lsp

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
1 nguyên tắc viết Lisp mà Tue_NV muốn góp ý cho Thaistreetz là : Khi viết Lisp nên áp dụng cho 1 trường hợp Tổng Quát , tức là mọi trường hợp, cộng trừ số đo góc đều có thể áp dụng được nó chứ không riêng gì góc có số đo 180độ (áp dụng đúng cho trường hợp góc có AdB'C"

 

Góp thêm 1 ý nữa cho chuỗi viết Lisp theo nguyên tắc :

Viết sao cho Tổng quát áp dụng được cho mọi trường hợp -> hình thành nên 1 tư duy khái quát được vấn đề

- viết càng đơn giản càng tốt nhưng phải áp dụng được cho trường hợp Tổng Quát

 

Mấy lời góp ý

Tue_NV

Cảm ơn anh đã góp ý. Tuy nhiên em nghĩ cái này cũng còn tùy thuộc cách tư duy hay thói quen của từng người đối với 1 công việc cụ thể anh ạ.

Em lấy ví dụ như trong trường hợp này.

Nhiều người sẽ muốn gộp chung tất cả mọi trường hợp cho 1 lệnh duy nhất. điều tất yếu sảy ra là trong quá trình chạy lisp sẽ phải thêm 1 bước lựa chọn hoặc + hoặc - hoặc phải nhâp vào 1 con số nào đó. Như thế nếu ta thực hiện lệnh này với n lần thì số lần phải nhập số liệu đầu vào cũng sẽ tăng lên n lần.

Em lựa chọn cách khác vì đây là công việc đã được chỉ ra cụ thể. ta chỉ cần nhập lệnh 1 lần duy nhất và công việc còn lại chỉ có pick, pick, và pick cho đến khi enter để kết thúc. (dĩ nhiên với code trên em còn thiếu sót là chưa cho vòng lặp vào). với cách viết này ta chỉ cần chú ý đặt tên các lệnh sao cho có hệ thống để dễ nhớ là được.

 

nguyên tắc "viết càng đơn giản càng tốt" của em cũng xuất phát từ quan điểm này. Ta viết lisp nên ta hiểu rõ về nó, ta biết cần phải nhập những gì, lựa chọn ra sao. nhưng nếu đặt mình vào vị trí người dùng, họ sẽ cảm thấy rối khi có quá nhiều bước, quá nhiều sự lựa chọn.

  • 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 anh đã góp ý. Tuy nhiên em nghĩ cái này cũng còn tùy thuộc cách tư duy hay thói quen của từng người đối với 1 công việc cụ thể anh ạ.

Em lấy ví dụ như trong trường hợp này.

Nhiều người sẽ muốn gộp chung tất cả mọi trường hợp cho 1 lệnh duy nhất. điều tất yếu sảy ra là trong quá trình chạy lisp sẽ phải thêm 1 bước lựa chọn hoặc + hoặc - hoặc phải nhâp vào 1 con số nào đó. Như thế nếu ta thực hiện lệnh này với n lần thì số lần phải nhập số liệu đầu vào cũng sẽ tăng lên n lần.

Em lựa chọn cách khác vì đây là công việc đã được chỉ ra cụ thể. ta chỉ cần nhập lệnh 1 lần duy nhất và công việc còn lại chỉ có pick, pick, và pick cho đến khi enter để kết thúc. (dĩ nhiên với code trên em còn thiếu sót là chưa cho vòng lặp vào). với cách viết này ta chỉ cần chú ý đặt tên các lệnh sao cho có hệ thống để dễ nhớ là được.

 

nguyên tắc "viết càng đơn giản càng tốt" của em cũng xuất phát từ quan điểm này. Ta viết lisp nên ta hiểu rõ về nó, ta biết cần phải nhập những gì, lựa chọn ra sao. nhưng nếu đặt mình vào vị trí người dùng, họ sẽ cảm thấy rối khi có quá nhiều bước, quá nhiều sự lựa chọn.

CAD và Lisp đã hỗ trợ phép tính cộng trừ nhân chia giữa các góc có số đo độ phút giây dạng AdB'C" rất tốt. Sao bạn lại làm thế? :D

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

phần 180- mình gặp như sau

hàm tách và trả đối tượng entsel mình chưa nắm vững nên khi thêm các biến phút giây mình không làm được.mình định làm thế này:

(độ : 179 -

phút: 59 -

giây: 60-

hoàn trả lại biến(val) để in.)

mình chỉ mới tập tành list thôi,mong các bạn giúp mình với.

cám ơn cadviệt 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
CAD và Lisp đã hỗ trợ phép tính cộng trừ nhân chia giữa các góc có số đo độ phút giây dạng AdB'C" rất tốt. Sao bạn lại làm thế? :D

Vì em chưa biết cái này, cũng chưa dành thời gian tìm hiểu kỹ về nó nên mới đành phải sử dụng phương pháp tách chuỗi thủ công như vậy bác ạ. cũng một phần vì thấy bài bạn t3pubt post mấy hôm rồi nhưng chưa có ai viết giúp bạn ấy nên em viết cái code đó để t3pubt dùng tạm. có thể cách giải quyết của em chưa tốt nhưng cũng là điều kiện để anh em trao đổi tìm ra hướng giải quyết tốt hơn.

@t3pubt: ý của mình khi viết code chủ yếu nằm ở thuật toán tách chuỗi, xử lý nó rồi lại nhập chuỗi để có đươc kết quả. bạn có thể tra các hàm mình sử dụng để hiểu hơn về cách là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

Trước tiên xin được cảm ơn bác gia_bach đã giúp đỡ.

Em xin có một việc nhờ các bác như sau:

Em tìm trên diễn đàn có một Lisp "SAPXEP" có thế "thống kê text" nhưng chưa được như ý, mong các cao thủ có thể sửa lại giúp em để nó có thể chạy được như sau không?

 

Chạy lisp sẽ yêu cầu Pick điểm cần chèn bảng thống kê, sau đó sẽ yêu cầu chọn các đối tượng text để thống kê, kết thúc việc chọn sẽ yêu cầu nhập khoảng cách giữa các hàng (mỗi hàng là một đối tượng text vừa chọn, giá trị mặc định là chiều cao của textstyle hiện hành), sau khi nhập khoảng cách các hàng hoặc enter chấp nhận giá trị mặc định sẽ cho ra một cột gồm nhiều hàng là các text đã được chọn.

 

Mục đích của em trong lisp này là lập một bảng thống kê danh mục bản vẽ trong điều kiện tên bản vẽ không nằm trong block thuộc tính mà là từng đối tượng text độc lập nhau nhưng em lại không "đủ trình" để viết.

 

xin chân thành cảm ơn các bác đã 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
Vì em chưa biết cái này, cũng chưa dành thời gian tìm hiểu kỹ về nó nên mới đành phải sử dụng phương pháp tách chuỗi thủ công như vậy bác ạ. cũng một phần vì thấy bài bạn t3pubt post mấy hôm rồi nhưng chưa có ai viết giúp bạn ấy nên em viết cái code đó để t3pubt dùng tạm. có thể cách giải quyết của em chưa tốt nhưng cũng là điều kiện để anh em trao đổi tìm ra hướng giải quyết tốt hơn.

@t3pubt: ý của mình khi viết code chủ yếu nằm ở thuật toán tách chuỗi, xử lý nó rồi lại nhập chuỗi để có đươc kết quả. bạn có thể tra các hàm mình sử dụng để hiểu hơn về cách làm.

Hàm Cal và lênh Units sẽ giải quyết vấn đề này của bạn

Set đơn vị units

(setvar "AUNITS" 1)

(setvar "auprec" 3)

-> Tính (c:cal "1d1'1\"+2d2'2\"")

-> ra kết quả : 3.05083 => Dùng hàm cvunits để chuyển 3.05083 về góc đo độ , phút và giây sau đó nối chuỗi lại

 

Command: cal

>> Expression: 1d1'2"+1d2'3"

2.05138889

 

-> Đây là bài toán cụ thể -> Đương nhiên, viết 1 Lisp Tống quát áp dụng cho nó sẽ hay hơn nhiều. Ứng dụng rộng rãi nữa

  • 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
@ Nguyen Hoanh!

Bác Hoành ơi, u đang dùng cái mplot của Bác, u thấy rất hay nhưng có 1 chút bất tiện là nó không sử dụng được khi in bên layout. Nhờ Bác sửa lại giúp u với.

Cảm ơn Bác nhiều! Chúc bác sức khoẻ!

hình như dạo này bác Hoanh "ẩn cư gian hồ" rồi, chẳng thấy bác ghé thăm cad việt nữa. Có bác biết cái món của Bác Hoành này không giúp út với. Cảm ơn các Bác, chúc các bác sức khoẻ!

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
Trước tiên xin được cảm ơn bác gia_bach đã giúp đỡ.

Em xin có một việc nhờ các bác như sau:

Em tìm trên diễn đàn có một Lisp "SAPXEP" có thế "thống kê text" nhưng chưa được như ý, mong các cao thủ có thể sửa lại giúp em để nó có thể chạy được như sau không?

 

Chạy lisp sẽ yêu cầu Pick điểm cần chèn bảng thống kê, sau đó sẽ yêu cầu chọn các đối tượng text để thống kê, kết thúc việc chọn sẽ yêu cầu nhập khoảng cách giữa các hàng (mỗi hàng là một đối tượng text vừa chọn, giá trị mặc định là chiều cao của textstyle hiện hành), sau khi nhập khoảng cách các hàng hoặc enter chấp nhận giá trị mặc định sẽ cho ra một cột gồm nhiều hàng là các text đã được chọn.

 

Mục đích của em trong lisp này là lập một bảng thống kê danh mục bản vẽ trong điều kiện tên bản vẽ không nằm trong block thuộc tính mà là từng đối tượng text độc lập nhau nhưng em lại không "đủ trình" để viết.

 

xin chân thành cảm ơn các bác đã giúp.

Bạn sài tạm : Lisp lập một bảng thống kê danh mục bản vẽ cho đối tượng text độc lập.

(defun c:sxT(/ ent h i lst msp obj pt row ss str tblobj tmp txtlength) 
 (vl-load-com)
 (princ "\nChon Text can thong ke  : ")
 (if (setq ss (ssget '((0 . "TEXT"))))
   (progn
     (setq i -1)
     (while (setq ent (ssname ss (setq i (1+ i))))
(setq obj (vlax-ename->vla-object ent)
      str (vla-get-TextString obj)
      lst (cons str lst)))
     (or *h* (setq *h* (* (getvar "dimtxt")(getvar "dimscale"))))
     (initget 6)
     (setq h (getreal (strcat "\nChieu cao chu <" (rtos *h*) "> :")))
     (if h (setq *h* h) (setq h *h*) )
     (if (setq pt (getpoint "\nDiem dat Bang :"))
(progn	  
  (setq txtLength 10)
  (foreach pt lst
    (if (> (setq tmp (strlen pt)) txtLength)
      (setq txtLength tmp) ) )
  (setq msp (vla-get-modelspace (vla-get-ActiveDocument (vlax-get-Acad-Object)))
	TblObj (vla-addtable msp (vlax-3d-point pt) (+ (length lst) 2) 2 (* 2 h) (* txtLength h)))
  (vla-put-regeneratetablesuppressed TblObj :vlax-true)
  (vla-put-vertcellmargin TblObj (* 0.75 h))
  (vla-SetColumnWidth TblObj 0 (* 6 h))
  (mapcar '(lambda (x)(vla-setTextHeight TblObj x h))
	  (list acTitleRow acHeaderRow acDataRow) )
  (mapcar '(lambda (x)(vla-setAlignment TblObj x 8))
	  (list acTitleRow acHeaderRow acDataRow))
  (vla-MergeCells TblObj 0 0 0 1)
  (vla-setText TblObj 0 0 "Bang thong ke : ")
  (vla-setText TblObj 1 0 "STT")
  (vla-setText TblObj 1 1 "Ten ban ve")
  (setq i 1 row 2)
  (foreach pt (vl-sort lst '<)
    (vla-setText TblObj row 0 (itoa i))
    (vla-setText TblObj row 1 pt)
    (setq row (1+ row) i (1+ i)))
  (vla-put-regeneratetablesuppressed TblObj :vlax-false)
  (vlax-release-object TblObj)	) ) ))
 (princ))

  • 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

Rất cảm ơn bác đã nhiệt tình giúp đỡ nhưng bác có thể đơn giản hóa lisp này hơn chút nữa không ạ, cụ thể là không cần nó phải ra cả một cái bảng mà trong đó không có chữ nào :D mà chỉ cần nó cho ra một cột gồm tất cả các text đã chọn (mỗi hàng một đối tượng text đã chọn - như thể là copy cái text đã chọn ấy ạ) và yêu cầu khoảng cách các hàng để sau đó em move tất cả chúng vào một bảng được kẻ bằng các line, như thế có phải dễ không ạ.

EM chỉ cần lisp này cho ra tên bản vẽ thôi còn kí hiệu thì em để ở một cột dùng Tcount sẽ ra ví dụ KC-01, KC-02, ........

Bác hiểu ý em chưa ạ?

 

kiểu như là đoạn code này nhưng mà thay vì nó sắp xếp theo hàng ta cho nó sắp theo cột ạ.

;; free lisp from cadviet.com
(defun c:sapxep (/ dsach pt pt1 ss ten txtsiz)
 (setq pt (getpoint "\nDiem dat Bang thong ke Text:"  )
txtsiz (* (getvar "dimtxt")(getvar "dimscale")) )
 (princ "\nChon Text can sap xep :")
 (while (setq ss (ssget (list (cons 0 "Text"))))
   (setq dsach (list) pt1 pt)
   (foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
     (setq ten (cdr (assoc 1 e))
    dsach (append (list ten) dsach) )
     )
   (foreach ten dsach
     (Make_Text_bl pt1 ten txtsiz)
     (setq pt1 (polar pt1 0 (* 10 txtsiz)))
     )
   (setq pt (polar pt (/ pi -2) (* 1.5 txtsiz)))
   (princ "\nChon Text can sap xep :")    
   )
 (princ)
)

(defun Make_Text_bl(pt val TextSize)
 (entmake (list '(0 . "TEXT")
                (cons 10 pt)
                (cons 40 TextSize)
                (cons 1 val)
                (cons 7 (getvar "TEXTSTYLE"))
                '(71 . 0)
                '(72 . 0)
                '(73 . 1)
                (cons 11 pt))))

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
Rất cảm ơn bác đã nhiệt tình giúp đỡ nhưng bác có thể đơn giản hóa lisp này hơn chút nữa không ạ, cụ thể là không cần nó phải ra cả một cái bảng mà trong đó không có chữ nào :D mà chỉ cần nó cho ra một cột gồm tất cả các text đã chọn (mỗi hàng một đối tượng text đã chọn - như thể là copy cái text đã chọn ấy ạ) và yêu cầu khoảng cách các hàng để sau đó em move tất cả chúng vào một bảng được kẻ bằng các line, như thế có phải dễ không ạ.

EM chỉ cần lisp này cho ra tên bản vẽ thôi còn kí hiệu thì em để ở một cột dùng Tcount sẽ ra ví dụ KC-01, KC-02, ........

Bác hiểu ý em chưa ạ?

 

kiểu như là đoạn code này nhưng mà thay vì nó sắp xếp theo hàng ta cho nó sắp theo cột ạ.

...............

Muốn đơn giản hóa ?! có ngay LISP sắp xếp theo cột.

(defun c:sapxep (/ dsach pt ss ten txtsiz)
 (defun Make_Text_bl(pt val TextSize)
   (entmake (list '(0 . "TEXT")
	   (cons 10 pt) (cons 40 TextSize) (cons 1 val)
	   (cons 7 (getvar "TEXTSTYLE"))
	   '(71 . 0)  '(72 . 0)'(73 . 1)
	   (cons 11 pt))))  
 (setq pt (getpoint "\nDiem dat Bang thong ke Text:"  )
txtsiz (* (getvar "dimtxt")(getvar "dimscale")) )
 (princ "\nChon Text can sap xep :")
 (while (setq ss (ssget (list (cons 0 "Text"))))
   (foreach e (mapcar 'entget (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
     (setq ten (cdr (assoc 1 e))
    dsach (append (list ten) dsach) ) )
   (foreach ten (vl-sort dsach '<)
     (Make_Text_bl pt ten txtsiz)
     (setq pt (polar pt (/ pi -2) (* 1.5 txtsiz))) )    
   (setq pt (polar pt (/ pi -2) txtsiz))
   (princ "\nChon Text can sap xep :")     )
 (princ))

  • 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
Hàm Cal và lênh Units sẽ giải quyết vấn đề này của bạn

Set đơn vị units

(setvar "AUNITS" 1)

(setvar "auprec" 3)

-> Tính (c:cal "1d1'1\"+2d2'2\"")

-> ra kết quả : 3.05083 => Dùng hàm cvunits để chuyển 3.05083 về góc đo độ , phút và giây sau đó nối chuỗi lại

 

Command: cal

>> Expression: 1d1'2"+1d2'3"

2.05138889

 

-> Đây là bài toán cụ thể -> Đương nhiên, viết 1 Lisp Tống quát áp dụng cho nó sẽ hay hơn nhiều. Ứng dụng rộng rãi nữa

Các hàm tính toán với số đo góc :

- (angtof string [units]) : đổi string qua radian (số thực)

 

- (angtos angle [unit [precision]]) : đổi radian qua kiểu string

Sau khi đổi string qua radian, thực hiện các phép tính (+-*/) như với số thực, kết quả thu đuợc đổi ra string.

Ví dụ :

(setq goc "16d41'29\"")

- đổi qua radian :

(setq rad (angtof goc 1))

- cộng với 90 độ :

(setq rad1 (+ rad (/ pi 2)))

- đổi về text :

(angtos rad1 1)

hay

(angtos (+ (angtof goc 1) (/ pi 2)) 1)

 

trừ với 90 độ

(angtos (- (angtof goc 1) (/ pi 2)) 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

Xin chào các anh...

 

Hôm nay e xin các a giúp e thêm 1 lisp nữa ( e có search trong diễn đàn rồi nhưng hình như ko có )

 

Input : một file nền hiện trạng của khu đất với rất nhiều polyline đường đồng mức ( nhưng chỉ dạng 2D không có 3D - cao độ Z = 0 hết )

 

Xin các a giúp e 1 lisp có yêu cầu thế này : Nhập cao độ Z cho polyline

 

1.chọn đường đồng mức ( polyline ) đầu - hiện yêu cầu nhập cao độ cho đđm này VD : 2 m

2.chọn đường đồng mức ( polyline ) cuối - hiện yêu cầu nhập cao độ cho đđm này VD : 10 m

3. Hiện yêu cầu nhập khoảng cách chênh cao giữa các đđm . Em ví dụ là 0.5 m

 

Thì lisp sẽ giúp nhập cao độ Z cho tất cả các đđm nằm giữa 2 đđm này .

Nâng cao thêm : Chọn màu cho đđm con ( khoang chenh la 0.5 m )

Chọn màu cho đđm cái ( khoang chenh la 2.5 m )

 

Xin Cảm Ơn các anh nhiều .

 

Sẵn tiện xin các a cho e chổ link vẽ đường đồng mức cho đường cong ạ - e có tìm nhưng thấy hình như chỉ có 1 chút

Mà link die rồi

Chỉnh sửa theo 843824

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

mình thấy cách viết của Thaistreetz áp dụng cho nova thì quá hay.mong Thaistreetz bỏ ra thêm ít thời gian viết giùm mình phần 180- .cám ơn bạn rất nhiều.việc chuyển đổi radian rồi lại đổi lại phức tạp quá. sao không đổi 180d=179d59'60" (áp dụng với 180-)làm cho nhanh.

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

Rất cảm ơn các cao thủ đã giúp em viết một số lisp rất hữu ích ở trên.

"Được voi đòi tiên", em lại xin nhờ các cao thủ một việc:

 

Công việc của em rất hay phải vẽ tiết diện thép chữ I tổ hợp từ 3 bản thép như sau:

Untitled.jpg

 

Một tiết diện như vậy thường có các tham số như sau (em cho luôn giá trị tron hình trên nhé):

 

Chiều cao tiết diện h = 350

Chiều rộng bản cánh b=250

chiều dày bản cánh dc=12

Chiều dày bản bụng db=8

 

Vậy em nhờ các bác viết giúp một lisp có thể chỉ cần nhập các giá trị trên là cho ngay ra một tiết diện như thế.

 

Mong các bác 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
Rất cảm ơn các cao thủ đã giúp em viết một số lisp rất hữu ích ở trên.

"Được voi đòi tiên", em lại xin nhờ các cao thủ một việc:

 

Công việc của em rất hay phải vẽ tiết diện thép chữ I tổ hợp từ 3 bản thép như sau:

Untitled.jpg

 

Một tiết diện như vậy thường có các tham số như sau (em cho luôn giá trị tron hình trên nhé):

 

Chiều cao tiết diện h = 350

Chiều rộng bản cánh b=250

chiều dày bản cánh dc=12

Chiều dày bản bụng db=8

 

Vậy em nhờ các bác viết giúp một lisp có thể chỉ cần nhập các giá trị trên là cho ngay ra một tiết diện như thế.

 

Mong các bác giúp đỡ.

Bạn sử dụng bộ fastcad của bác Nothien

http://www.google.com.vn/search?hl=vi&...q=&gs_rfai=

 

Command:

Chon ti le ve (1/x), x= 25

 

Chon Loai tiet dien Thep can ve (ong,hop,c,z,L,I) : I

 

Nhap chieu cao tiet dien : 350

 

Nhap chieu rong tiet dien : 250

 

Nhap chieu day canh : 12

 

Nhap chieu day bung : 8

 

Chon vi tri tam cua tiet dien :

  • Vote tăng 2

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
Rất cảm ơn các cao thủ đã giúp em viết một số lisp rất hữu ích ở trên.

"Được voi đòi tiên", em lại xin nhờ các cao thủ một việc:

 

Công việc của em rất hay phải vẽ tiết diện thép chữ I tổ hợp từ 3 bản thép như sau:

Untitled.jpg

 

Một tiết diện như vậy thường có các tham số như sau (em cho luôn giá trị tron hình trên nhé):

 

Chiều cao tiết diện h = 350

Chiều rộng bản cánh b=250

chiều dày bản cánh dc=12

Chiều dày bản bụng db=8

 

Vậy em nhờ các bác viết giúp một lisp có thể chỉ cần nhập các giá trị trên là cho ngay ra một tiết diện như thế.

 

Mong các bác giúp đỡ.

Hề hề hề,

Chào bạn congdung04,

Việc viết cái lisp này không khó nhưng cũng không thể gấp ngay được vì mình cũng đang hơi bận. Bạn có thể phải chờ chút chút. Tuy nhiên nếu bạn cần gấp thì trong lúc chờ đợi bạn có thể tham khảo mấy bài hướng dẫn lập trình lisp trên diễn đàn của bác SSG và bác Nguyenhoanh để tự viết cho mình được. Thời gian nhanh hay chậm phụ thuộc vào khả năng của chính bạn chứ chả phải nhờ ai cả.

Bạn cũng đã hiểu về công dụng của lisp thì nên chủ động học tập và nghiên cứu về nó để có thể phục vụ tốt cho công việc của chính mình.

Dù rất muốn giúp bạn xong mình cũng như mọi người trên diễn đàn không phải lúc nào cũng rảnh rỗi để có thể đáp ứng ngay được, mong bạn thông cảm nhé.

Chúc bạn vui.

  • 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

Vâng, viết lisp đã, đang và sẽ mãi là niềm ao ước của em, em không có năng khiếu về lập trình nên nghĩ là nó rất khó, cũng chưa có thời gian nghiên cứu nhiều nên chưa một lần tự viết cho mình một lisp được. Em sẽ nghiên cứu thêm và hi vọng có ngày em làm được như các bác bây giờ để viết cho những bạn chưa biết như em hiện tạ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
Vâng, viết lisp đã, đang và sẽ mãi là niềm ao ước của em, em không có năng khiếu về lập trình nên nghĩ là nó rất khó, cũng chưa có thời gian nghiên cứu nhiều nên chưa một lần tự viết cho mình một lisp được. Em sẽ nghiên cứu thêm và hi vọng có ngày em làm được như các bác bây giờ để viết cho những bạn chưa biết như em hiện tại.

Hề hề hề,

Chào bạn congdung04,

Của bạn đây, tranh thủ giải lao mình viết tạm cái này để bạn xài thử, nếu có vấn đề gì thì postt lên nhé. Lisp này mình cho vẽ với tỉ lệ 1:1 và sử dụng kiểu hatch ansí31 ( kiểu thường dùng cho mặt cắt kim loại) tỷ lệ hatch là 50. Nếu bạn muốn có thể thay đổi cái hatch này trong dòng lệnh sau:

(command "bhatch" "s" a0 a1 a2 a3 "" "p" "ansi31" 50 0 "" "")

Bạn copy lisp này vào một thư mục có trong đường dẫn tìm kiếm của Cad và load nó vào Cad để thử nhé. Lệnh là isec (nghĩa là I section).

http://www.cadviet.com/upfiles/3/isec.lsp

(defun c:Isec ( )
(setq h (getreal "\n Nhap chieu cao mat cat : ")
       b (getreal "\n Nhap chieu rong mat cat : ")
       d (getreal "\n Nhap chieu day ban canh : ")
       db (getreal "\n Nhap chieu day ban bung : ")
       p0 (getpoint "\n Nhap diem khoi tao"))
(command "rectang" p0 (list (+ b (car p0)) (- (cadr p0) d)))
(setq a0 (entlast))
(command "rectang" (list (car p0) (- (cadr p0) h)) (list (+ (car p0) b ) (- (cadr p0) (- h d))))
(setq a1 (entlast))
(setq p1 (list (+ (car p0) (/ (- b db) 2)) (- (cadr p0) d))
       p2 (polar p1 0 db)
       p3 (polar p1 (- (/ pi 2)) (- h d d))
       p4 (polar p3 0 db))
(command "pline" p1 p3 "")
(setq a2 (entlast))
(command "pline" p2 p4 "")
(setq a3 (entlast))
(command "break" a0  p1 p2)
(command "break" a1  p3 p4)
(command "bhatch" "s" a0 a1 a2 a3 "" "p" "ansi31" 50 0 "" "")
(princ)
)

 

Chúc bạn vui.

  • 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
Sao vẫn không thấy ai hết vậy nhỉ

bạn dùng lisp này nhé. lệnh c1 vẽ một cánh và lệnh c2 vẽ hai cách.Lisp này em sưu tầm đc hy vọng là giúp ích cho bác.xin phép tác giả cho em dc post lên cho anh em tham khảo cùng.

http://www.cadviet.com/upfiles/3/lam_quy_hoach.lsp

  • 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

Xin lỗi e spam chút xíu :

Các anh ơi … có ai xem giúp e cái lisp e xin ở trên với ạ.

 

Với thêm nếu cái đó chưa thể viết ngay được các a cho e xin cái lisp như vầy :

- Input : có đường cong bất kì và 1 block

- Các a giúp e viết cái lisp nào mà sau khi e copy cái block đó đến các điểm trên đường cong thì block đó sẽ tự động quay theo phương tiếp tuyến với đường cong tại điểm đó.

Nếu có thể : nâng cao lên : hỏi xem quay block đó về bên trái hay bên phải của đường cong

 

Thank các a rất nhiều – vì hiện giờ e phải copy rất nhiều cái như vậy và quay từng cái theo phương tiếp tuyến . Hoặc có cách nào khác ko cần lisp xin các a chỉ dạ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
Khách
Chủ đề này bây giờ đã bị đóng lại để trả lời thêm.

×