qh2qa06
-
Số lượng nội dung
68 -
Đã tham gia
-
Lần ghé thăm cuối
Bài đăng được đăng bởi qh2qa06
-
-
Lisp đây: http://www.cadviet.com/upfiles/6/141736_slope.rar
- Quét chọn.
- Nếu vùng text cần quét, tất cả các text sắp xếp đều theo lưới ô vuông thì chỉ 1 lần quét là xong, còn không thì phải chọn từng cặp đôi.
*** Nếu chọn vùng Text có khoảng cách giữa các text không đều, hoặc đều từng cụm thì khoảng cách min, hoặc cụm có khoảng cách min sẽ được thực hiện...
- Lệnh: SLOPE.
Anh chỉnh giúp em như sau được không:
- Tên lệnh: DDS
- Style của text ghi độ dốc theo style của text hiện hành. Lần đầu dùng lệnh, hỏi chiều cao chữ của text độ dốc.
- Mũi tên theo Dim hiện hành.
- Layer của cả mũi tên và text theo layer hiện hành.
Cảm ơn anh!
-
Lisp đây: http://www.cadviet.com/upfiles/6/141736_slope.rar
- Quét chọn.
- Nếu vùng text cần quét, tất cả các text sắp xếp đều theo lưới ô vuông thì chỉ 1 lần quét là xong, còn không thì phải chọn từng cặp đôi.
*** Nếu chọn vùng Text có khoảng cách giữa các text không đều, hoặc đều từng cụm thì khoảng cách min, hoặc cụm có khoảng cách min sẽ được thực hiện...
- Lệnh: SLOPE.
Cảm ơn bác nhiều!
-
Nhờ các chuyên gia giúp em viết lisp tính độ dốc giữa 2 cao độ text, vẽ mũi tên chỉ hướng dốc từ điểm có cao độ lớn đến điểm có cao độ nhỏ.
Nội dung như sau:
1. Chọn 2 cao độ text cần tìm độ dốc (chọn bằng cách tích text hay quét cửa sổ đều được).
2. Căn cứ vào vị trí của text và giá trị cao độ text, tính ra độ dốc giữa 2 điểm text. Điền mũi tên độ dốc và giá trị độ dốc từ điểm cao độ lớn đến điểm cao độ nhỏ. Phương của mũi tên độ dốc trùng với phương của 2 điểm text.
3. Trường hợp giá trị độ dốc bằng 0%, điền mũi tên 2 đầu.
Chi tiết em ghi trong file đính kèm. Nhờ mọi người giúp đỡ! Em xin chân thành cảm ơn!
-
Dạo này ít thấy bác Tot77 xuất hiện nhỉ? Bạn ấy tính Tốt cũng như nhiệt tâm về Lisp của nick Tot77 :) .
Chúc bạn Tot77 thành công và đầy sáng tạo trong niềm đam mê của mình :).
Lisp Tot77 chỉ chạy đúng trong điều kiện bản vẽ cụ thể nên bạn đừng thắc mắc kiểu như trên :D .
Trong trường hợp bản vẽ này của bạn thì sữa như sau :
(car (vl-remove-if-not '(lambda (x) (< (distance (dxf 10 v) (dxf 11 x)) 1)) l)) thì sửa thành 0.5
Cảm ơn bạn!
-
Bạn dùng cái này. Nó chỉ hỏi 1 lần thôi.
(defun c:cca (/ ss sstk sstn sscc v cdtk tm cc cdtn tm1) (defun dxf (id v) (cdr (assoc id (entget v)))) (defun gan(v l) (car (vl-remove-if-not '(lambda(x) (< (distance (dxf 10 v) (dxf 11 x)) 1)) l)) ) (if (not laylist) (setq laylist (cons (dxf 8 (car (entsel "\nChon doi tuong thuoc layer Cao do thiet ke :"))) laylist) laylist (cons (dxf 8 (car (entsel "\nChon doi tuong thuoc layer Cao do tu nhien :"))) laylist) laylist (cons (dxf 8 (car (entsel "\nChon doi tuong thuoc layer Chenh cao :"))) laylist) ) ) (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "X" (list '(0 . "TEXT") (cons 8 (strcat (car laylist)"," (cadr laylist) "," (last laylist)))))))) sstk (vl-remove-if-not '(lambda(x) (= (dxf 8 x) (last laylist))) ss) sstn (vl-remove-if-not '(lambda(x) (= (dxf 8 x) (cadr laylist))) ss) sscc (vl-remove-if-not '(lambda(x) (= (dxf 8 x) (car laylist))) ss)) (while sstk (setq v (car sstk) sstk (cdr sstk) cdtk (atof (dxf 1 v)) tm (gan v sstn) cc (gan v sscc)) (if (and tm cc) (setq cdtn (atof (dxf 1 tm)) sstn (vl-remove tm sstn) sscc (vl-remove cc sscc) tm1 (entmod (subst (cons 1 (rtos (- cdtk cdtn) 2 3)) (assoc 1 (entget cc)) (entget cc))) ) ) ) (princ) )
Cho em hỏi, em dùng lsp trên rất tốt nhưng có một số bản vẽ lỗi. Anh sửa giúp em được không ạ?
-
@qh2qa06:
Bạn là thành viên đã 4 năm mà không chịu khó học hỏi được tí gì sao, cứ dựa mãi vào người khác thì sao mà tiến bộ được
Hãy xem lệnh ttk sửa như thế nào rồi tự sửa lệnh ttl
- có phải bạn không chọn đc polyline phải ko ^^, nhoc đã sửa lại chắc ok
(vl-load-com) ;================== (defun c:TTL (/ old lmax lmin ename1 ename2 dai1 dai2 info1 sl info2 ltb ldelta e1 e2) ; (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai be nhat:") (setq lmin (ssget "+.:E:S" '((0 . "*LINE")))) (if lmin (progn (setq dai1 0.0) (while (setq ename1 (ssname lmin 0)) (setq dai1 (+ dai1 (Length1 ename1))) (ssdel ename1 lmin)) (setq dai1 (distof (rtos dai1 2 3))) ) ) ;========================================================= (prompt "Chon thanh co chieu dai lon nhat:") (setq lmax (ssget "+.:E:S" '((0 . "*LINE")))) (if lmax (progn (setq dai2 0.0) (while (setq ename2 (ssname lmax 0)) (setq dai2 (+ dai2 (Length1 ename2))) (ssdel ename2 lmax)) (setq dai2 (distof (rtos dai2 2 3))) ) ) ;=========================================================== (setq sl (getint "\nSo luong thanh mun tinh:")) (setq ltb (distof (rtos (/ (+ dai1 dai2) 2.0) 2 3))) (if (= (- ltb (fix ltb)) 0.5) (setq ltb (+ ltb 0.5)) ltb ) (setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000.0)) ;============================================================== (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") (while (/= (cdr (assoc 0 e1)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`14, L=" (rtos (* ltb 1000) 2 0))) (assoc 1 e1) e1)) ;=============================================================== (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") (while (/= (cdr (assoc 0 e2)) "DIMENSION") (prompt "doi tuong ban chon ko phai la dim, ban chon lai hen!!!") (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") ) (entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) ;====================================================================== (setvar "osmode" old) (princ "\n") (princ) ) ;===============================chon thanh co chieu dai ko doi edit vao text co san (defun c:ttk(/ lx ename3 info3 dai3 e3 old sl dk) (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai khong doi:") (setq lx (ssget "+.:E:S" '((0 . "*LINE")))) (if lx (progn (setq dai3 0.0) (while (setq ename3 (ssname lx 0)) (setq dai3 (+ dai3 (Length1 ename3))) (ssdel ename3 lx)) (setq dai3 (distof (rtos dai3 2 3))) ) ) (setq sl (getint "\nSo luong thanh mun tinh:")) (setq dk (getstring "\nNhap duong kinh Thep:")) ;==================================================== (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") (while (/= (cdr (assoc 0 e3)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) dk ", L=" (rtos (* dai3 1000) 2 0))) (assoc 1 e3) e3)) (setvar "osmode" old) (princ "\n") (princ) ) ;============================================= (defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) ;=========================================================- p/s: nói khó cũng ko khó dễ cũng ko phải dễ ^^,với ai chưa pit về lsp chỉ xem qua code dù nhiều lần cũng khó mà nắm đc để có thể tự sửa, bản thân nhoc lúc trước cũng vậy, có khi mún sửa lại hóa ra phá ^^,anh ndtnv đừng khó khăn quá :P
Lâu lắm rồi mới vào diễn đàn để cảm ơn bạn lần nữa. Lsp đã dùng rất tốt. Cảm ơn bạn!
-
Mình hơi vội nên chưa check mà cảm ơn bạn trước. Có gì mình sẽ báo kết quả sau.
-
@Nhoclangbat: Mình có 1 file bị lỗi không dùng được lsp ttl.
Bạn kiểm tra giúp mình được không? Cảm ơn bạn!
-
- hihi ko có chi, thử viết theo y/c của các bạn cũng là cơ hội cho nhoc mày mò, luyện tay, mót thêm đc nhiều cái hay ^^
Yêu cầu nhiều, chỉ sợ bị mắng.
May mà nhoc dễ tính!
Nhân 20-10, chúc cho những người phụ nữ trong gia đình của nhoc may mắn và hạnh phúc!
-
1
-
-
- ok nhoc đã sữa lại lệnh ttk, có thể chọn line or pline đều đc ^^
(vl-load-com) ;================== (defun c:TTL (/ old lmax lmin ename1 ename2 info1 sl info2 dai1 dai2 ltb ldelta e1 e2) ; (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai be nhat:") (setq lmin (ssget "+.:E:S" '((0 . "LINE")))) (if lmin (progn (setq ename1 (ssname lmin 0) info1 (entget ename1) dai1 (distof (rtos (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1))) 2 3)) ) ) ) ;========================================================= (prompt "Chon thanh co chieu dai lon nhat:") (setq lmax (ssget "+.:E:S" '((0 . "LINE")))) (if lmax (progn (setq ename2 (ssname lmax 0) info2 (entget ename2) dai2 (distof (rtos (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2))) 2 3)) ) ) ) ;=========================================================== (setq sl (getint "\nSo luong thanh mun tinh:")) (setq ltb (distof (rtos (/ (+ dai1 dai2) 2.0) 2 3))) (if (= (- ltb (fix ltb)) 0.5) (setq ltb (+ ltb 0.5)) ltb ) (setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000)) ;============================================================== (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") (while (/= (cdr (assoc 0 e1)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`14, L=" (rtos (* ltb 1000) 2 0))) (assoc 1 e1) e1)) ;=============================================================== (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") (while (/= (cdr (assoc 0 e2)) "DIMENSION") (prompt "doi tuong ban chon ko phai la dim, ban chon lai hen!!!") (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") ) (entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) ;====================================================================== (setvar "osmode" old) (princ "\n") (princ) ) ;===============================chon thanh co chieu dai ko doi edit vao text co san (defun c:ttk(/ lx ename3 info3 dai3 e3 old sl dk) (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai khong doi:") (setq lx (ssget "+.:E:S" '((0 . "*LINE")))) (if lx (progn (setq dai3 0.0) (while (setq ename3 (ssname lx 0)) (setq dai3 (+ dai3 (Length1 ename3))) (ssdel ename3 lx)) (setq dai3 (distof (rtos dai3 2 3))) ) ) (setq sl (getint "\nSo luong thanh mun tinh:")) (setq dk (getstring "\nNhap duong kinh Thep:")) ;==================================================== (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") (while (/= (cdr (assoc 0 e3)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) dk ", L=" (rtos (* dai3 1000) 2 0))) (assoc 1 e3) e3)) (setvar "osmode" old) (princ "\n") (princ) ) ;============================================= (defun Length1(e) (vlax-curve-getDistAtParam e (vlax-curve-getEndParam e))) ;=========================================================Lsp dùng tốt rồi. Cảm ơn bạn!
-
- nhoc đã sửa lại rùi, nhoc nghĩ cái đường kính bạn nhập là số ^^, giờ chuyển lại thành dạng text, khi lsp hỏi nhập đường kính thì bạn nhập sao cũng đc
- Vd: nhap duong kinh thep:`14 hay ~14 đều đc, dạng dữ liệu nhập là dạng chuỗi thì bạn nhập gì cũng đc, dài thòng lòng cũng đc ^^
(defun c:TTL (/ old lmax lmin ename1 ename2 info1 sl info2 dai1 dai2 ltb ldelta e1 e2) ; (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai be nhat:") (setq lmin (ssget "+.:E:S" '((0 . "LINE")))) (if lmin (progn (setq ename1 (ssname lmin 0) info1 (entget ename1) dai1 (distof (rtos (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1))) 2 3)) ) ) ) ;========================================================= (prompt "Chon thanh co chieu dai lon nhat:") (setq lmax (ssget "+.:E:S" '((0 . "LINE")))) (if lmax (progn (setq ename2 (ssname lmax 0) info2 (entget ename2) dai2 (distof (rtos (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2))) 2 3)) ) ) ) ;=========================================================== (setq sl (getint "\nSo luong thanh mun tinh:")) (setq ltb (distof (rtos (/ (+ dai1 dai2) 2.0) 2 3))) (if (= (- ltb (fix ltb)) 0.5) (setq ltb (+ ltb 0.5)) ltb ) (setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000)) ;============================================================== (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") (while (/= (cdr (assoc 0 e1)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`14, L=" (rtos (* ltb 1000) 2 0))) (assoc 1 e1) e1)) ;=============================================================== (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") (while (/= (cdr (assoc 0 e2)) "DIMENSION") (prompt "doi tuong ban chon ko phai la dim, ban chon lai hen!!!") (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") ) (entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) ;====================================================================== (setvar "osmode" old) (princ "\n") (princ) ) ;===============================chon thanh co chieu dai ko doi edit vao text co san (defun c:ttk(/ lx ename3 info3 dai3 e3 old sl dk) (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai khong doi:") (setq lx (ssget "+.:E:S" '((0 . "LINE")))) (if lx (progn (setq ename3 (ssname lx 0) info3 (entget ename3) dai3 (distof (rtos (distance (cdr (assoc 10 info3)) (cdr (assoc 11 info3))) 2 3)) ) ) ) (setq sl (getint "\nSo luong thanh mun tinh:")) (setq dk (getstring "\nNhap duong kinh Thep:")) ;==================================================== (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") (while (/= (cdr (assoc 0 e3)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) dk ", L=" (rtos (* dai3 1000) 2 0))) (assoc 1 e3) e3)) (setvar "osmode" old) (princ "\n") (princ) )P/s: nhoc đã test rùi ok, ko có lỗi gì hết, có thể là lúc chọn text để thay đổi bạn chưa chọn gì hết nhấn enter lun hay nhấn chuột phải lun nên nó báo lỗi
Mình biết tại sao bị lỗi rồi. Đối tượng trong thanh trong lsp của bạn là Line, còn đối tượng mình muốn chọn là Polyline nên báo lỗi. Bạn sửa lại đối tượng thanh là Polyline được không vì thanh thép nhiều khi bị uốn theo chiều dài loằng ngoằng (chữ U, chữ nhật) chứ không phải chỉ có 1 đường thẳng. Tks.
-
hi hi, của bạn đây ^^
(defun c:TTL (/ old lmax lmin ename1 ename2 info1 sl info2 dai1 dai2 ltb ldelta e1 e2) ; (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai be nhat:") (setq lmin (ssget "+.:E:S" '((0 . "LINE")))) (if lmin (progn (setq ename1 (ssname lmin 0) info1 (entget ename1) dai1 (distof (rtos (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1))) 2 3)) ) ) ) ;========================================================= (prompt "Chon thanh co chieu dai lon nhat:") (setq lmax (ssget "+.:E:S" '((0 . "LINE")))) (if lmax (progn (setq ename2 (ssname lmax 0) info2 (entget ename2) dai2 (distof (rtos (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2))) 2 3)) ) ) ) ;=========================================================== (setq sl (getint "\nSo luong thanh mun tinh:")) (setq ltb (distof (rtos (/ (+ dai1 dai2) 2.0) 2 3))) (if (= (- ltb (fix ltb)) 0.5) (setq ltb (+ ltb 0.5)) ltb ) (setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000)) ;============================================================== (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") (while (/= (cdr (assoc 0 e1)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`14, L=" (rtos (* ltb 1000) 2 0))) (assoc 1 e1) e1)) ;=============================================================== (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") (while (/= (cdr (assoc 0 e2)) "DIMENSION") (prompt "doi tuong ban chon ko phai la dim, ban chon lai hen!!!") (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") ) (entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) ;====================================================================== (setvar "osmode" old) (princ "\n") (princ) ) ;===============================chon thanh co chieu dai ko doi edit vao text co san (defun c:ttk(/ lx ename3 info3 dai3 e3 old sl dk) (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai khong doi:") (setq lx (ssget "+.:E:S" '((0 . "LINE")))) (if lx (progn (setq ename3 (ssname lx 0) info3 (entget ename3) dai3 (distof (rtos (distance (cdr (assoc 10 info3)) (cdr (assoc 11 info3))) 2 3)) ) ) ) (setq sl (getint "\nSo luong thanh mun tinh:")) (setq dk (getint "\nNhap duong kinh Thep:")) ;==================================================== (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") (while (/= (cdr (assoc 0 e3)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`" (itoa dk) ", L=" (rtos (* dai3 1000) 2 0))) (assoc 1 e3) e3)) (setvar "osmode" old) (princ "\n") (princ) )Bạn ơi dùng Lsp báo lỗi như sau:
Chon thanh co chieu dai khong doi:Select objects:So luong thanh mun tinh:4Nhap duong kinh Thep:8chon text ghi ket qua L khong doi:; error: bad argument type: numberp: nilChon thanh co chieu dai khong doi:
Select objects:
So luong thanh mun tinh:4
Nhap duong kinh Thep:8
chon text ghi ket qua L khong doi:
; error: bad argument type: numberp: nil
Mình muốn trong câu lệnh nhập đường kính thép thêm fi của thép nữa bằng tiền tố "`" (tương đương fi gai) hoặc "~" (tương đương fi thường) có được không?
Hiện lsp chỉ cho phép nhập đường kính thép là số. Nếu muốn thêm ký hiệu fi gai hoặc fi thường thì trong câu lệnh nhập đường kính phải cho phép nhập thêm tiền tố ` hoặc ~.
-
- hi bạn úp lên nguồn khác hộ mình hen, tải trực tiếp file lsp lên trang cadviet ko tải đc, hoặc bạn nén file đó thành .rar hay . zip rùi up lên = 4rum thì tải đc
Mình nén thành rar rồi đấy:
http://www.cadviet.com/upfiles/3/64018_nhap_chieu_dai_thep_ttl_ttk_1.rar
-
- ek sr bạn, nhoc tính edit lại thêm vô phần nhập đường kính thép mà lỗi gì đó lúc save changes mất tiu code rùi ^^, bạn tải chưa úp lên lại nhoc thêm vô tí ^^, ah cái đường kinh ấy bạn có dùng tính gì ko để nhoc áp kiểu cho nó là dạng text trong lsp lun nếu ko dùng nó để tính toán gì khác
Đây là lsp mình tải về: http://www.cadviet.com/upfiles/3/64018_nhap_chieu_dai_thep_ttl_ttk.lsp
Bạn làm cái mới cho mình từ lsp "ttk" là được.
Đầu vào
1. Chọn thanh thép để lấy chiều dài (chiều dài đã chọn trong bản vẽ là m)
2. Nhập số lượng thanh
3. Nhập đường kính thép
Kết quả
Chọn text ghi kết quả L: Số lượng thanh_đường kính thép_, L= chiều dài thanh thép đã chọn ở trên và làm tròn đến mm.
Cảm ơn bạn!
-
- cái if nhoc làm biếng xóa ^^ chứ ko cần nó nữa vì nhoc đã làm tròn lấy 3 số lẻ từ thằng lmin, lmax, LTB phần thô trước tính theo m, đến cuối khi in ra nhoc mới * cho 1000 để đổi ra mm ^^
- để nhoc ngâm thử xem, ý bạn là cái biến fi ấy sẽ lưu lại dùng cho lệnh TTL lun phải ko
Không, biến fi mình chỉ dùng cho ttk thôi. Mình sẽ dùng cho thống kê thép trong cống, rãnh, các công trình thoát nước nói chung để thống kê thép cho nhanh vì trong các công trinh thoát nước thì sử dụng nhiều loại thép có đường kính khác nhau.
Lsp bạn viết trên (cả ttl và ttk) mình dùng cho thiết kế thép cho tấm BTXM, thép của tấm BTXM không thay đổi đường kính.
Cảm ơn bạn!
-
- hi nhoc đã sữa lại theo ý bạn, làm tròn lmin lmax trước rùi mới tính ltb để tránh sai số ko đáng có, bạn test thử vài trường hợp xem có còn sai ko
- nay nhoc mới thấy phần hỏi thêm của bạn nên nhoc viết lun, cai chọn thanh có L ko đổi, chung 1 lsp lệnh ttk
(defun c:TTL (/ old lmax lmin ename1 ename2 info1 sl info2 dai1 dai2 ltb ldelta e1 e2) ; (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai be nhat:") (setq lmin (ssget "+.:E:S" '((0 . "LINE")))) (if lmin (progn (setq ename1 (ssname lmin 0) info1 (entget ename1) dai1 (distof (rtos (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1))) 2 3)) ) ) ) ;========================================================= (prompt "Chon thanh co chieu dai lon nhat:") (setq lmax (ssget "+.:E:S" '((0 . "LINE")))) (if lmax (progn (setq ename2 (ssname lmax 0) info2 (entget ename2) dai2 (distof (rtos (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2))) 2 3)) ) ) ) ;=========================================================== (setq sl (getint "\nSo luong thanh mun tinh:")) (setq ltb (distof (rtos (/ (+ dai1 dai2) 2.0) 2 3))) (if (= (- ltb (fix ltb)) 0.5) (setq ltb (+ ltb 0.5)) ltb ) (setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000)) ;============================================================== (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") (while (/= (cdr (assoc 0 e1)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`14,L =" (rtos (* ltb 1000) 2 0))) (assoc 1 e1) e1)) ;=============================================================== (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") (while (/= (cdr (assoc 0 e2)) "DIMENSION") (prompt "doi tuong ban chon ko phai la dim, ban chon lai hen!!!") (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (princ "\n") ) (entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) ;====================================================================== (setvar "osmode" old) (princ "\n") (princ) ) ;===============================chon thanh co chieu dai ko doi edit vao text co san (defun c:ttk(/ lx ename3 info3 dai3 e3 old sl) (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai khong doi:") (setq lx (ssget "+.:E:S" '((0 . "LINE")))) (if lx (progn (setq ename3 (ssname lx 0) info3 (entget ename3) dai3 (distof (rtos (distance (cdr (assoc 10 info3)) (cdr (assoc 11 info3))) 2 3)) ) ) ) (setq sl (getint "\nSo luong thanh mun tinh:")) ;==================================================== (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") (while (/= (cdr (assoc 0 e3)) "TEXT") (prompt "Ban chon ko phai la text, ban chon lai hen!!!") (setq e3 (entget (car (entsel "\nchon text ghi ket qua L khong doi:")))) (princ "\n") ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (entmod (subst (cons 1 (strcat (itoa sl) "`14,L =" (rtos (* dai3 1000) 2 0))) (assoc 1 e3) e3)) (setvar "osmode" old) (princ "\n") (princ) )Lsp đã hoàn chỉnh. Cảm ơn bạn rất nhiều!
Trong Lisp "ttk", nếu muốn chọn đường kính thép (hiện ở đây đang là fi 14), bạn cho thêm câu lệnh hỏi "Nhập đường kính thép" (8, 10, 12, 14, 16,...) rồi mới đến các lệnh khác, bạn sửa giúp mình thêm lệnh này được không? Tks.
-
^^ thanhks anh ndtnv góp ý, ngành này nhoc cũng ko rành lắm nên chỗ thanh'14 nhoc ko pit là gì cứ nghĩ nó là (- sl 1) kaka, lúc xem file bạn đó trình bày nhoc cũng có ý tưởng như anh vậy, quét chọn rùi tính lun 1 lần, nhưng lại ko nghĩ ra giải thuật để làm vậy ^^, chọn thanh thuộc layer nào đó, lấy đc chiều dài từng line nhưng ko biết lọc min max = cách nào ^^, nên đành viết theo ý chang bạn đó trình bày thấy nó đơn giản hơn :)
Mình không cần quét thanh đâu, mình cần pick thanh nên bạn cứ để như lsp đang viết là tốt cho mình rồi.
Cảm ơn bạn!
Giải thích thêm tại sao mình không dùng quét thanh. Vì trên bản vẽ, đôi khi có nhiều thanh trùng 1 vị trí mà người vẽ không kiểm soát được, sẽ dẫn đến sai sót. Thường bọn mình đếm thanh dựa vào Dim, như trong bản vẽ của mình dùng số khoảng cách x khoảng cách giữa 2 thanh cạnh nhau. Vì thế số thanh nhập tay sẽ chuẩn hơn là số thanh quét ra tự động.
-

Nếu đơn vị tính là container thì lisp.ttl của anh Nhóc sai số sẽ tính bằng đơn vị xe cải tiến 2 bánh, một người kéo hai người đẩy! :) :) :)
Không hiểu bên Xây dựng dư nào, bên Cơ khí, khi cắt thép để đảm bảo kết cấu thì phải cắt thép theo chiều dài trung bình của đoạn thép và cắt vát 23°mới đảm bảo tiết kiệm thép mà không ảnh hưởng đến kết cấu.
Bọn mình thiết kế tấm BTXM. Tại vị trí khúc cua sẽ có những tấm có hình thù cực kỳ kì dị, không cố định góc vát đâu bạn.
Ở lisp này thấy nhoc ko thể hiện được kí hiệu fi gai (chỉ có ở bigfont) nhỉ? :)
Nếu số luong thanh muốn tính là 100 thì chẳng lẻ có fi gai = 99 :wacko:
Fi gai đã thể hiện ở dấu "`" rồi, khi để font chữ shx sẽ thành dấu hiệu fi 2 gạch là fi gai. Bạn xem trong file đính kèm của mình là thấy.
@Nhoc: Giá trị tính ra lúc làm tròn lên, lúc làm tròn xuống. Hình như do chiều dài thanh "nhìn thấy là Lmin=1026 nhưng thật ra vẫn còn một ít sau dấu phảy. Bạn có cách nào để khử giá trị Lmin, Lmax, chỉ lấy đúng 3 số sau dấu phảy được không?
-
Thấy bạn thương nhà thầu như thế ai nỡ nào không giúp :) , bạn sữa chỗ:
(rtos ltb 2 0) thành (rtos (fix(+ ltb 1)) 2 0)
Không phải thương nhà thầu mà là làm chưa đúng. Các bác ấy lấy máy tính tay tính ra, phải làm tròn lên chứ không làm tròn xuống được, sai mình lại phải sửa hồ sơ.
Hiện tại với lsp của Nhoclangbat thì thiếu 1 đơn vị, không đáng bao nhiêu với thực tế nhưng không đúng với con số tính ra.
Các bác sửa giúp em một Lsp hoàn chỉnh ạ!
-
Bạn Nhóc bận nên mình phỏng tay trên:
Bạn thay (entmod (subst (cons 1 (strcat (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))
bằng (entmod (subst (cons 1 (strcat "So thanh' " (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1))
Cảm ơn bạn, mình sửa được rồi.
@Nhoclangbat: Có 1 vấn đề nhỏ nhỏ ở Lsp này. Đó là chiều dài trung bình chưa làm tròn mà chỉ lấy phần nguyên. Ví dụ: Lmin=2197, Lmax=2776 thì Ltb tính ra là 2486 - Mình muốn giá trị tính ra được làm tròn như thông thường, tức là nếu nó là 2486.5 sẽ làm tròn lên là 2487 để không thiếu khối lượng cho nhà thầu có được không?
-
-thanks bạn đã ok lsp nhoc ^^, thêm tiền tố đó ko khó, nhưng giờ nhoc đang đi thực địa hẹn bạn chiều tối nhoc sẽ sửa giúp bạn, bạn có mún thêm gì ko nhoc xem nếu đc nhoc sua lun 1 lan
Mình xin thêm 1 Lsp dành cho thanh có chiều dài không đổi. File mình đính kèm theo. Cảm ơn bạn!
http://www.cadviet.com/upfiles/3/64018_tinh_chieu_dai_thanh_thep_trung_binh_1.dwg
-
Một ý kiến nhỏ:
Có thể lấy Lmin, Lmax từ dim (hoặc text, hoặc nhập từ bàn phím ...) thì hay hơn.
Vì với những chi tiết có chiều dài rất rất lớn so với chiều rộng (và cả 2 bề đều biến thiên) thì bản vẽ thường đc biểu diễn có nét cắt dích dắc >>> thanh thép có chiều dài ko đúng kích thước thật.
Hoặc với bản vẽ in trên model, có scale tỉ lệ cũng vậy ...
Có nhiều lúc mình phải sửa bản vẽ của người khác nữa mà bạn !!!
Bản vẽ của bọn mình chỉ đúng như file đính kèm thôi. Bên mình không có chi tiết phức tạp, chỉ vẽ thép cho tấm BT thôi nên chiều dài thanh thép vẽ trên hình là chuẩn luôn, pick trực tiếp vào chiều dài thanh trên bản vẽ là phù hợp nhất và tiết kiệm thời gian nhất.Nét vẽ mặt cắt zigzag phải là dân cầu hoặc cơ khí, bên mình không cần.
-
-thanks bạn đã ok lsp nhoc ^^, thêm tiền tố đó ko khó, nhưng giờ nhoc đang đi thực địa hẹn bạn chiều tối nhoc sẽ sửa giúp bạn, bạn có mún thêm gì ko nhoc xem nếu đc nhoc sua lun 1 lan
Bọn mình chờ vậy. Mình chỉ cần thêm tiền tố đó là có một Lsp theo đúng yêu cầu của mình.
Cảm ơn bạn!
-
- hi hi lâu lâu nhóc thử tự viết lsp theo y/c ko chỉnh sửa lsp cũ xem thế nào, bạn dùng thử cho nhoc ý kiến hen ^^
(defun c:TTL (/ old lmax lmin ename1 ename2 info1 info2 dai1 dai2 ltb ldelta e1 e2) ; (setq old (getvar "osmode")) (setvar "osmode" 0) (prompt "Chon thanh co chieu dai be nhat:") (setq lmin (ssget "+.:E:S" '((0 . "LINE")))) (if lmin (progn (setq ename1 (ssname lmin 0) info1 (entget ename1) dai1 (distance (cdr (assoc 10 info1)) (cdr (assoc 11 info1))) ) ) ) ;========================================================= (prompt "Chon thanh co chieu dai lon nhat:") (setq lmax (ssget "+.:E:S" '((0 . "LINE")))) (if lmax (progn (setq ename2 (ssname lmax 0) info2 (entget ename2) dai2 (distance (cdr (assoc 10 info2)) (cdr (assoc 11 info2))) ) ) ) ;=========================================================== (setq sl (getint "\nSo luong thanh mun tinh:")) (setq ltb (* (/ (+ dai1 dai2) 2.0) 1000)) (setq ldelta (* (/ (- dai2 dai1) (- sl 1)) 1000)) (setq e1 (entget (car (entsel "\nchon text ghi ket qua L trung binh:")))) (entmod (subst (cons 1 (strcat (itoa (- sl 1)) ",L = " (rtos ltb 2 0))) (assoc 1 e1) e1)) ;=============================================================== (setq e2 (entget (car (entsel "\nchon dim ghi ket qua L delta:")))) (entmod (subst (cons 1 (strcat (rtos (* dai1 1000) 2 0) "~" (rtos (* dai2 1000) 2 0) ", \U+0394L=" (rtos ldelta 2 0))) (assoc 1 e2) e2)) (setvar "osmode" old) (princ "\n") (princ) )Bạn ơi Lsp bạn viết cho mình tính đủ hết rồi, nhưng mình muốn sửa dòng ghi giá trị trung bình là: Số thanh rồi đến dấu ` rồi mới là 14,L=chiều dài trung bình. Hiện Lsp viết ra thiếu tiền tố Số thanh`. Bạn thêm tiền tố đó vào giúp mình được không?
Cảm ơn bạn!
[Yêu cầu] Lisp tính cao độ khi biết cao độ và độ dốc
trong AutoLisp
Đã đăng · Trả lời báo cáo
Em muốn nhờ các chuyên gia, nếu bác Tot77 có vào đây giúp em càng tốt ạ. Lisp trên tính cho 1 điểm. Bây giờ em có nhiều điểm và muốn thiết kế cho một hệ thống lưới các điểm có cùng độ dốc.
Chi tiết em ghi rõ trong file đính kèm ạ. Em cảm ơn nhiều!
http://www.cadviet.com/upfiles/6/64018_tinh_cao_do_diem_theo_mat_luoi_cho_mot_nhom_diem.dwg