Đến nội dung


Hình ảnh
- - - - -

[Nhờ viết lisp] tính chênh cao cho mắt lưới


  • Please log in to reply
14 replies to this topic

#1 levanhuong1989

levanhuong1989

    biết vẽ circle

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

Đã gửi 27 September 2014 - 12:08 PM

Chào các bác trong diễn đàn!

Trong công việc em có phát sinh một công đoạn lặp lại là lấy giá trị của text CDTK - CDTN ra chênh cao, em làm thì có rất nhiều mắt lưới nên làm rất tốn thời gian vì vậy em lập topic để mong các bác giúp em viết 1 lisp với nội dung như sau:

Trên bản vẽ có:

-Các  text CDTN, CDTK, Chenhcao có điểm đặt trùng nhau hoặc cách nhau 1 khoảng rất nhỏ  (Em có kèm theo bản vẽ để các bác dễ giúp đỡ)

Lisp mong muốn:

-Gõ lệnh và lisp hỏi chọn CDTN chọn xong hỏi tiếp chọn CDTK và hỏi tiếp chọn text Chenhcao  (dùng chuột quét toàn bộ 1 vùng nào đó để chọn đối tượng)

-Lisp tính ra chênh cao của các text đặt gần nhau với 1 khoảng nào đó chẳng hạn mà người dùng nhập vào và gán chênh cao đó cho các text thuộc layer Chenhcao đặt gần đó.

Mong các bác trong diễn đàn giúp đỡ.

Cảm ơn các bác!http://www.cadviet.c..._ban_ve_mau.dwg


  • 0

#2 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 27 September 2014 - 02:05 PM

Những cái text đó nằm gần nhau sẵn rồi cần gì hỏi nhập khoảng câch làm chi? tôi cho nó = 1 (kc tối đa)

bạn thử cái này. Tuy có thể quét chọn toàn bộ bản vẽ, nhưng để kiểm tra thì chỉ nên quét 1 phần tùy theo mắt bạn để tìm sự thay đổi trị số.

(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))
  )
  (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex
(ssget '((0 . "TEXT") (8 . "CDTN,CDTK,CHENH CAO")))))) 
sstk (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTK")) ss)
sstn (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTN")) ss)
        sscc (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "Chenh cao")) 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 (abs (* 100 (- cdtn cdtk))) 2 1)) (assoc 1 (entget cc)) (entget cc)))
)
    )   
  )
  (princ)
) 
 

  • 1

#3 levanhuong1989

levanhuong1989

    biết vẽ circle

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

Đã gửi 28 September 2014 - 09:00 AM

Cảm ơn bác Tot77 nhiều. phần khoảng cách thì em muốn lựa chọn nhập vào vì đôi khi bản vẽ của người khác sẽ dịch đi 1 khoảng nào đó để tránh phải move về gần nhau thì có thể nhập khoảng cách vào. Đoạn nhập khoảng cách thì em có thể tự sửa được, Cảm ơn bác lần nữa.


  • 0

#4 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 01 October 2014 - 04:46 PM

Em cũng cần tính chênh cao nên em post luôn vào đây.

Em đã có Text Cao độ Thiết kế và Text Cao độ tự nhiên. Bây giờ em cần tính Chênh cao và điền luôn vào cùng vị trí điểm tính ra, điền tự động luôn ạ. Các bác giúp em được không?

Em xin cảm ơn ạ!

 

http://www.cadviet.c...op_cac_diem.dwg


  • 0

#5 nhoclangbat

nhoclangbat

    Edu level: li10

  • Members
  • PipPipPipPipPipPipPip
  • 1409 Bài viết
Điểm đánh giá: 379 (khá)

Đã gửi 01 October 2014 - 05:51 PM

- hihi nhoc lại xon xen , nếu layer "CC" của bạn là chênh chao, thì bạn chỉ cần tải lsp trên về mở ra sữa chỗ nào có chữ "Chenh cao" trong lsp thành "CC" là ok rùi, có 2 chỗ thui nhanh mà ^^


  • 0
"...................][)e\/i][_ /\/\@Y CrY....................."

(defun THỔ_DÂN_HỌC_CAD (xxxx) ...) ^_^








#6 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 01 October 2014 - 06:59 PM

Thì sửa cái lsp trên 1 chút, nhưng ở đây thấy có 3 số lẻ và không nhân 100.

(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))
 )
 (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex
(ssget "X" '((0 . "TEXT") (8 . "CDTN,CDTK,CC"))))))
       sstk (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTK")) ss)
       sstn (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTN")) ss)
       sscc (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CC")) 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)
)
 
 

  • 1

#7 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 02 October 2014 - 08:03 AM

Gõ lệnh một phát là có kết quả luôn, kỳ diệu quá!

 

Thì sửa cái lsp trên 1 chút, nhưng ở đây thấy có 3 số lẻ và không nhân 100.

 

(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))
  )
  (setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex
(ssget "X" '((0 . "TEXT") (8 . "CDTN,CDTK,CC"))))))
sstk (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTK")) ss)
sstn (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CDTN")) ss)
        sscc (vl-remove-if-not '(lambda(x) (= (dxf 8 x) "CC")) 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 (abs  (- cdtn cdtk)) 2 3)) (assoc 1 (entget cc)) (entget cc)))
    )
    )
  )
  (princ)
) 
 
 

Nhưng layer để tính sẽ phải là CDTK, CDTN và CC đúng không ạ?

Em cảm ơn bác!

Bác ơi giá trị CC = CDTK-CDTN. Lisp của bác đang tính là lấy số lớn trừ số nhỏ nên kết quả tính không đúng trên toàn bộ mặt bằng. Kết quả Chênh cao của em có cả giá trị âm (-), dương (+) và 0. Âm là đào, dương là đắp.


  • 0

#8 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 02 October 2014 - 09:48 AM

Đã sửa và up lại ở #6.


  • 1

#9 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 02 October 2014 - 10:18 AM

Đã sửa và up lại ở #6.

Em cảm ơn bác nhiều!


  • 0

#10 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 03 October 2014 - 08:02 AM

Đã sửa và up lại ở #6.

Em muốn anh chỉnh giúp em là Cao độ thiết kế được chọn Layer chứ không cố định là CDTK, tương tự Cao độ tự nhiên và Chênh cao cũng chọn Layer tương ứng chứ không cố định là CDTN và CC có được không ạ?


  • -1

#11 Tot77

Tot77

    biết lệnh adcenter

  • Members
  • PipPipPipPipPipPipPip
  • 990 Bài viết
Điểm đánh giá: 498 (tốt)

Đã gửi 03 October 2014 - 08:45 AM

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

  • 1

#12 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 15 October 2014 - 01:28 PM

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

Em cảm ơn anh!


  • 0

#13 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 25 November 2015 - 02:47 PM

 

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

http://www.cadviet.c...p_cc_bi_loi.dwg


  • 0

#14 pphung183

pphung183

    biết dimstyle

  • Members
  • PipPipPipPipPip
  • 384 Bài viết
Điểm đánh giá: 425 (tốt)

Đã gửi 25 November 2015 - 04:31 PM

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

http://www.cadviet.c...p_cc_bi_loi.dwg

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


  • 2

#15 qh2qa06

qh2qa06

    biết vẽ pline

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

Đã gửi 08 January 2016 - 02:22 PM

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!


  • 0