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

[Yeu cau] lisp vẽ đường electrical

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

Nhờ Các Bác trên diễn đàn viết hộ em 1 lisp vẽ đường điện như sau:

file dữ liệu là file excel.csv gồm có:

+TT.

+Khoảng cách

+Góc lái.

+Block

 

file kết quả là file cad như ví dụ em gửi

Cám ơn Các Bác

http://www.cadviet.com/upfiles/3/98866_vi_du.rar

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 Kính Nhờ Các Bác Cao thủ trên diễn đàn giúp đỡ Em.

Hề hề hề,

Bạn dùng thử cái này coi đã đúng ý bạn hay chưa nhé. Do không phải chuyên ngành của bạn nên mình đoán mò theo cái bản vẽ bạn gửi lên thôi, không rõ có đúng ý đồ của bạn hay không. Mình gửi lên để bạn kiểm tra , nếu được sẽ hoàn chỉnh sau.

Bạn lưu ý cần sửa lại cái file csv để CAD có thể không nhầm lẫn như sau:

1/- Xóa toàn bộ các dòng tiêu đề, chỉ để lại các dòng dữ liệu sử dụng.

2/- Sửa các text ghi góc lái, bỏ dấu " sau con số chỉ giây hoặc bạn đổi các giá trị này về giá trị thập phân của độ. Tỷ như 38o29'54" thành 38o29'54 hoặc 38.49833 độ. Lưu ý rằng khi bạn không chuyển về giá trị thập phân theo độ thì CAD sẽ chỉ nhận góc chẵn độ đễ tính toán tức là 38 độ còn số lẻ sẽ bị bỏ qua.

Hãy test thử và nếu có gì chưa ưng ý hãy post lên để mình xem lại.

 

(defun c:vdd ()
(setq  fn (getfiled "Select Data File" "" "csv" 0)
            f (open fn "r")
            k 1 
)
(command "undo" "be")
(setq p1 (getpoint "\n Nhap diem bat dau ve"))
(setq a1 (getreal "\n Nhap goc bat dau ve theo radian: "))
(while (and  (/= (setq str (read-line f)) nil) (/= (atof str) 0.0))
       (setq lst (separate str (chr 44)))
       (setq lst1 (separate (nth 2 lst) "="))
       (if (> (length lst1) 1)
           (progn
                    (if (= (nth 0 lst1) "T")
                        (progn 
                                 (command "insert" (nth 3 lst)  p1 1 1 (+ (/ (* 180 a1) pi) (/ (atof (nth 1 lst1)) 2 )))
                                 (command "pline" p1 (setq p1 (polar p1 (setq a1 (+ a1 (/ (* pi (atof (nth 1 lst1))) 180))) (atof (nth 1 lst)))) "")
                                 
                        )
                        (progn
                                 (command "insert" (nth 3 lst)  p1 1 1 (- (/ (* 180 a1) pi) (/ (atof (nth 1 lst1)) 2)))
                                 (command "pline" p1 (setq p1 (polar p1 (setq a1 (-  a1 (/ (* pi (atof (nth 1 lst1))) 180))) (atof (nth 1 lst)))) "")
                                 
                        )
                    )
          )
          (progn   
                    (command "insert" (nth 3 lst)  p1 1 1 (+ (/ (* 180 a1) pi) (atof (nth 2 lst))))                 
                    (command "pline" p1 (setq p1 (polar p1 (+ a1 (atof (nth 2 lst))) (atof (nth 1 lst)))) "")
                    
          )
       )
)
(command "undo" "e")
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
      (setq i (1+ i) ch (substr S i 1))
      (if (= ch sym) (progn
(setq
     L (append L (list (substr S 1 (- i 1))))
     S (substr S (1+ i) (- (strlen S) i))
     i 0
)
      ))
)
(append L (list S))
)      

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ề hề hề!

Bác Bình "phải có trách nhiệm" lấy được giá trị góc kiểu 1d2'3" chứ ai lại bắt bỏ cái " đi (dùng substr thô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

Cám ơn Bác Bình Và Bác Hà Giúp Em . Em Chạy Lisp của Bác Đúng Với Công Việc của Em rồi. Nhưng Bác giúp em bổ sung cho em thêm 1 số ý như sau:

+ Như Ý Bác Hà Ngợi Ý lấy giá trị góc kiểu 1d2'3'' Bác Ạ.

+ Bác bổ sung cho em thứ tự cột và khoảng cách cột nữa.

Cám ơn các Bác chúc các bác có 1 ngày chủ nhật vui vẻ !

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Cám ơn Bác Bình Và Bác Hà Giúp Em . Em Chạy Lisp của Bác Đúng Với Công Việc của Em rồi. Nhưng Bác giúp em bổ sung cho em thêm 1 số ý như sau:

+ Như Ý Bác Hà Ngợi Ý lấy giá trị góc kiểu 1d2'3'' Bác Ạ.

+ Bác bổ sung cho em thứ tự cột và khoảng cách cột nữa.

Cám ơn các Bác chúc các bác có 1 ngày chủ nhật vui vẻ !

Hề hề hề,

1/- Cái việc bắt lisp phải cắt không phải quá khó, song quả thực chả biết chủ thớt còn những kiểu ghi góc gì nữa nên hơi lười. Theo góp ý của bác DoanVanHa mình đã bổ sung việc này, song nếu chủ thớt lại đổi kiểu ghi góc lái thì lisp này sẽ thua.

2/- Bổ sung thêm phần ghi khoảng cách giữa các cột và đánh số cột. Tuy nhiên cũng do lười nên mình không sử dụng hàm con cho nó nên code hơi rườm rà. Chủ thớt hoặc các bác khác có thể gom thành một hàm con để làm việc này thì code sẽ gọn gàng và oai hơn nhiều.

 

Hề hề hề,

 

 

(defun c:vdd (/ fn f p1 a1 lst lst1)
(setq  fn (getfiled "Select Data File" "" "csv" 0)
            f (open fn "r")
)
(command "undo" "be")
(setq p1 (getpoint "\n Nhap diem bat dau ve"))
(setq a1 (getreal "\n Nhap goc bat dau ve theo radian: "))
(while (and  (/= (setq str (read-line f)) nil) (/= (atof str) 0.0))
       (setq lst (separate str (chr 44)))
       (setq lst1 (separate (substr (nth 2 lst) 2 (- (strlen (nth 2 lst)) 2)) "="))
       (if (> (atof (nth 1 lst)) 0.0)
       (if  (> (length lst1) 1) 
           (progn
                    (if (= (nth 0 lst1) "T")
                        (progn 
                                 (command "insert" (nth 3 lst)  p1 1 1 (+ (/ (* 180 a1) pi) (/ (atof (nth 1 lst1)) 2 )))
                                 (setvar "cecolor" "6")
                                 (command "circle" (polar p1 (-  a1 (/ pi 2)) 10) 5)
                                 (setvar "cecolor" "0")
                                 (command "text" "j" "mc" (polar p1 (- a1 (/ pi 2)) 10) 4 (* 180 (/ a1 pi)) (itoa (1- (atoi (nth 0 lst)))))
                                 (command "pline" p1 (setq p1 (polar p1 (setq a1 (+ a1 (/ (* pi (atof (nth 1 lst1))) 180))) (atof (nth 1 lst)))) "")
                                 (command "text" "j" "mc" (polar (polar p1 (- a1 pi) (/ (atof (nth 1 lst)) 2)) (+ a1 (/ pi 2)) 5) 2.5 (* 180 (/ a1 pi)) 
 
(nth 1 lst))
                        )
                        (progn
                                 (command "insert" (nth 3 lst)  p1 1 1 (- (/ (* 180 a1) pi) (/ (atof (nth 1 lst1)) 2)))
                                 (setvar "cecolor" "6")
                                 (command "circle" (polar p1 (-  a1 (/ pi 2)) 10) 5)
                                 (setvar "cecolor" "0")
                                 (command "text" "j" "mc" (polar p1 (- a1 (/ pi 2)) 10) 4 (* 180 (/ a1 pi)) (itoa (1- (atoi (nth 0 lst)))))
                                 (command "pline" p1 (setq p1 (polar p1 (setq a1 (-  a1 (/ (* pi (atof (nth 1 lst1))) 180))) (atof (nth 1 lst)))) "")
                                 (command "text" "j" "mc" (polar (polar p1 (- a1 pi) (/ (atof (nth 1 lst)) 2)) (+ a1 (/ pi 2)) 5) 2.5 (* 180 (/ a1 pi)) 
 
(nth 1 lst))
                        )
                    )
          )
          (progn   
                    (command "insert" (nth 3 lst)  p1 1 1 (+ (/ (* 180 a1) pi) (atof (nth 2 lst)))) 
                    (setvar "cecolor" "6")
                    (command "circle" (polar p1 (-  a1 (/ pi 2)) 10) 5)
                    (setvar "cecolor" "0")
                    (command "text" "j" "mc" (polar p1 (- a1 (/ pi 2)) 10) 4 (* 180 (/ a1 pi)) (itoa (1- (atoi (nth 0 lst)))))
                    (command "pline" p1 (setq p1 (polar p1 (+ a1 (atof (nth 2 lst))) (atof (nth 1 lst)))) "")
                    (command "text" "j" "mc" (polar (polar p1 (- a1 pi) (/ (atof (nth 1 lst)) 2)) (+ a1 (/ pi 2)) 5) 2.5 (* 180 (/ a1 pi)) (nth 1 
 
lst))
          )
       )
       )
)
(command "insert" (nth 3 lst)  p1 1 1 (+ (/ (* 180 a1) pi) (atof (nth 2 lst)))) 
(setvar "cecolor" "6")
(command "circle" (polar p1 (-  a1 (/ pi 2)) 10) 5)
(setvar "cecolor" "0")
(command "text" "j" "mc" (polar p1 (- a1 (/ pi 2)) 10) 4 (* 180 (/ a1 pi)) (nth 0 lst))
(command "undo" "e")
)
 
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun Separate (S sym / i L ch)
(setq i 0 L nil)
(while (< i (strlen S))
      (setq i (1+ i) ch (substr S i 1))
      (if (= ch sym) (progn
(setq
     L (append L (list (substr S 1 (- i 1))))
     S (substr S (1+ i) (- (strlen S) i))
     i 0
)
      ))
)
(append L (list S))
)      

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ác Bình ơi Bác xem lại hộ em xem cứ đến đoạn góc là lisp dùng lại không chạy nữa Bác ạ.

file số liệu đây bác ạ:

Chia sẻ bài đăng này


Liên kết tới bài đăng
Chia sẻ trên các trang web khác

Sao mãi em mới úp đwowcj lên Bác Ạ

http://www.cadviet.com/upfiles/3/98866_file_du_lieu.rar

Hề hề hề,

Lỗi là do bạn đã sử dụng dạng format khác với file mẫu bạn đã gửi. Mình không thể biết bạn sẽ sử dụng bao nhiêu loại format khác nhau nên không thể cho ra một lisp có thể đọc mọi loại format oái oăm của bạn. Vì thế bạn nên thống nhất một dạng format thể hiện giá trị góc lái này. nên sử dụng như bản vẽ bạn đã post hoặc dạng thể hiện số đo độ theo dạng thập phân như mình đã post ở bài trước.

Còn nếu bạn muốn sử dụng dạng format kiểu 28d21'54" thì bạn phải chịu khó sửa lại dòng code:

(setq lst1 (separate (substr (nth 2 lst) 2 (- (strlen (nth 2 lst)) 2)) "="))

thành:

(setq lst1 (separate (substr (nth 2 lst) 2 4) "="))

và test thử coi sao.

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

Thanhk Bác Bình. CAD sẽ chỉ nhận góc chẵn độ đễ tính toán. Bác và các Bác trên diễn đàn cho em hỏi có cách nào để tính táon chính xác góc có cả độ phút và giây không. Nếu có nhờ các Giúp em .Cám ơn 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

Thanhk Bác Bình. CAD sẽ chỉ nhận góc chẵn độ đễ tính toán. Bác và các Bác trên diễn đàn cho em hỏi có cách nào để tính táon chính xác góc có cả độ phút và giây không. Nếu có nhờ các Giúp em .Cám ơn các Bác nhiều!

Hề hề hề,

Thực ra không phải lỗi do CAD mà là do hàm (atof ...) trong lisp. Để có thể nhận được đúng kết quả thì số đo góc của bạn nên được thể hiện dưới dạng số đo thập phân của độ như trong bài trước mình đạ đề cập. Như vậy khi hàm (atof .....) làm việc nó sẽ trả về đúng giá trị số đo của góc mà không mất đi một li một lai nào.

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

Ơ hay! Sao không angtof mà atof bác Bình nhỉ?

Hề hề hề,

Sorry all. Lỗi là do mình dốt thôi. Cái hàm (angtof....)  mình chửa xài bao giờ (hoặc là quá ít dùng) nên không biết là có nó. Còn cái thằng (atof ...) thì quen mặt rồi nên cứ thế mà dùng chứ cũng chả nghĩ ngợi gì nhiều bác ạ.

Để mình ngâm cứu thêm thằng này rồi sẽ sửa lisp sau vậy.

Hề hề hề,...

 

Chu choa, dùng cái thằng (angtof ... ) xem ra còn oái oăm hơn (atof .... ) bác ạ. Vì nếu format chuỗi số đo góc trong Excel mà hổng giống ai như của chủ thớt thì (angtof .... ) nó luôn trả về nil bác ạ. 

Thôi thì cứ (atof ....) cho nó lành vậy. Ít ra còn có chút hiêu hiểu về nó mà chọc ngoáy tùy theo dạng format của chủ thớt vậ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

Vâng Vậy nhờ Bác Bình sửa lại lisp giúp em cho độ chính xác của góc cao. 

Hề hề hề,

Chịu chết nếu như chả biết bạn format cái text trong excels theo kiểu gì bạ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

Dạ Em không hiểu hàm trong cad nhận góc trong dữ liệu đầu vào như thế nào .Vậy Em nhờ Bác sửa hộ em dữ liệu đầu vào của góc của text trong excel để hàm có thể vẽ chính xác độ, phút , giây. Em cám ơn 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

Dạ Em không hiểu hàm trong cad nhận góc trong dữ liệu đầu vào như thế nào .Vậy Em nhờ Bác sửa hộ em dữ liệu đầu vào của góc của text trong excel để hàm có thể vẽ chính xác độ, phút , giây. Em cám ơn Bác nhiều...

Hề hề hề,

Như mình đã nói rồi mà. Cái hàm (atof ...) thì nó nhận theo cách format là số đo độ theo hệ thập phân là chuẩn nhất. Tỷ như 21d52' 48'' thì bạn nên đổi thành 21.88 độ

Còn với hàm (angtof .... ) thì số đo độ ghi trên excel lại phải trùng khớp với cách ghi số đo góc trong CAD. Điều này không hề dễ dàng bởi các số liệu đọc từ excel đều được CAd hiểu theo nghĩa là các chuỗi text chứ không phải chuỗi ký tự đơn vị đo góc. Vì thế hầu hết các chuỗi này khi dùng hàm (angtof .....) đều bị trả về nil. Mình cũng chưa biết cách xử lý vấn đề này. Có nhẽ sẽ có các bác khác giúp bạn. Mình chỉ mới biết sơ sơ là hàm (angtof ....) sẽ trả về đúng giá trị của góc nếu như chuỗi ký tự trong hàm là nhận được từ hàm (angtos ....). Do chưa biết cách chuyển chuỗi ký tự từ excel thành chuỗi tương tự như của hàm (angtos....) nên đành bó ..... lisp bạn ạ.

Theo quan điểm hơi chuối của mình thì cứ mèo nào bắt được chuột là mèo tốt nên bạn hãy thử dùng hàm (atof ....) theo cái cách mà mình gợi ý trên xem nó có ngon lành không nào. Việc chuyển dữ liệu từ số đo độ theo độ phút giây thành số đo dộ theo hệ thập phân trong excel không phải là quá khó nếu như bạn sử dụng excel thành thạo. Với các hàm có sẵn trong excel, bạn chỉ cần lập một công thức rồi quét một nhát là ăn tiền, khỏi phải lăn tăn này nọ bạn ạ.

Chúc bạn thành cô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

Tạo một tài khoản hoặc đăng nhập để nhận xét

Bạn cần phải là một thành viên để lại một bình luận

Tạo tài khoản

Đăng ký một tài khoản mới trong cộng đồng của chúng tôi. Điều đó dễ mà.

Đăng ký tài khoản mới

Đăng nhập

Bạn có sẵn sàng để tạo một tài khoản ? Đăng nhập tại đây.

Đăng nhập ngay

Đăng nhập để thực hiện theo  

×