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

nguyentuyen6

Nhà quảng cáo
  • Số lượng nội dung

    212
  • Đã tham gia

  • Lần ghé thăm cuối

  • Ngày trúng

    3

Bài đăng được đăng bởi nguyentuyen6


  1. Hi`. em đã xoá hết các dòng co liên quan đến Dim thì được cái này. (chỉ dùng cho text)

     

     

    ;; free lisp from cadviet.com
    
    (defun c:chsize ( / bng ebl stlst htlst sdlst hdlst bln ent els stl ht bld sd ent1
                             els1 std hd sdlst hdlst sst n i et el st bl e1 s1 el1 e2 e3 k m pt)
    (command "undo" "be")
    (setq bng (car (entsel " \n Chon doi tuong block nguon "))
           stlst (list)
           htlst (list)
           sdlst (list)
           hdlst (list)
    )
    (while bng
    (setq ebl (entget bng))
    (if (= (cdr (assoc 0 ebl)) "INSERT")       
       (progn
                (setq  bln (cdr (assoc 2 ebl))
                         ent (cdr (assoc -2 (tblsearch "block"  bln)))         
                 )
        )
       (progn
              (alert "\n Doi tuong chon khong phai la block, hay chon lai block chua cac doi tuong nguon")
              (setq bng (car (entsel "\n Chon block chua cac doi tuong nguon")))
        )
    )
    (setq bng nil)
    )
    (while ent
            (setq els (entget ent))
            (if  (= (cdr (assoc 0 els)) "TEXT" )
                (progn
                        (setq stl (cdr (assoc 7 els))
                                ht (cdr (assoc 40 els))
                                stlst (append stlst (list stl))
                                htlst (append htlst (list(append stlst (list ht))))
                                stlst (list)
                        )
                  )
             )
    
    
             (setq ent (entnext ent))
    )
    
    ;;;;;; (alert "\n Chon tap doi tuong dich")
    (setq sst (ssget (list (cons 0 "TEXT,MTEXT,INSERT")))
           n (sslength sst)
           i 0
    )
    (while (< i n)
            (setq et (ssname sst i)
                    el (entget et)
            )
            (if (or (= (cdr (assoc 0 el)) "TEXT") (= (cdr (assoc 0 el)) "MTEXT"))
                (progn
                    (setq  st (cdr (assoc 7 el)))
                    (foreach ls htlst
                          (if (= (car ls) st)
                             (setq el (subst (cons 40 (cadr ls)) (assoc 40 el) el))
                          ) 
                          (entmod el)
                    )
                 )
             )
    
    
                (if (= (cdr (assoc 0 el)) "INSERT")
                    (upwb et htlst hdlst)
                )
    
             (setq i (1+ i))
    )
    
    
    (command "undo" "e")
    (princ)
    
    )
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    (defun UPWB (blk lst1 lst2 / e el s st bl e1 s1 el1 k m pt )
    (setq s (cdr (assoc 2 (entget blk))))
    (setq e (cdr (assoc -2 (tblsearch "BLOCK" s))))
    (while e
    (setq el (entget e))
    (if (wcmatch (cdr (assoc 0 el)) "INSERT")
    (UPWB e)
    )
    (if (or (= (cdr (assoc 0 el)) "TEXT") (= (cdr (assoc 0 el)) "MTEXT"))
                (progn
                    (setq  st (cdr (assoc 7 el)))
                    (foreach ls lst1
                          (if (= (car ls) st)
                             (setq el (subst (cons 40 (cadr ls)) (assoc 40 el) el))
                          ) 
                          (entmod el)
                    )
                 )
             )
    
    
    
    (setq e (entnext e))
    )
    )        
    

     

     

    Tuy nhiên khi chọn block nguồn thì phải chọn 2 lần, chọn 1 lần không được. bác tbinh sửa giúp em với,he.

    àh còn về phần dim thì em đã ko nghĩ ký để bác phải suy nghĩ nhiều. hjx. Ý em định là khi scale khung tên mỗi khung tên sẽ có 1 block nguồn. Tuy nhiên e đã quên mà không nghĩ ra rằng: dùng lệnh scale đối với dim thì tet hight không thay đổi. Vì cái nguồn của em ở đây nó là block nên khi scale nó lên thì nó cũng chỉ là hiển thị thôi, chứ nếu vào blockeditor thì thấy ngay được là text hight không đổi. Có lẽ đây chính là vấn đề..he


  2. Cảm ơn bác thanhbinh rất nhiều về cái lisp e đã yêu cầu. E cũng mong được dốt như bác đấy.hehe,

    E cũng vừa tét xong và thấy rằng, khi chạy lệnh xong thì: TEXT của dim đích có thay đổi lại thật, nhưng nó chỉ là hiển thị thôi, chứ bản chất thì CAD vẫn hiểu nó là TEXT có chiều cao y nguyên lúc chưa dùng lệnh. Bằng chứng là chỉ cần di chuyển cái TEXT đó là nó lại bị quay về chiều cao ban đầu. hoặc là sau khi chạy líp, bật Ctrl+1 thì cái TEXT HIGHT của dim vẫn chả thay đổi so với ban đầu cả. Vậy theo em nghĩ chỉ cần làm sao thay đổi được TEXT HIGHT = cách giống như bật Ctrl+1 lên rồi đổi là không bị lỗi như thế nữa ( đổi tận gốc ). Hix em nói là nói vậy thôi chứ về líp thì em hoàn toàn mù tịt. Mong các bác sớm khắc phục được giúp e . Cảm ơn bạn tbinh và mọi người nhiều

    • Vote tăng 1

  3. :D Trước hết E xin cảm ơn bác thanhbinh nhiều lắm.

     

    E cũng vừa test thử líp bác vừa viết và có một vài chỗ mong bác hoàn thiện hộ E với nhé.

     

    1. KHi thực hiện lísp. Đối với các text nếu có thể bác thêm hộ em với cả cái Mtext với nhé. ^^! (lúc em yêu cầu chưa có cái này, hehee, mới phát sinh )

    2. Về đường Dim:

    - Em thường để cái text dim nằm trên đường dim, nên cái khoảng hở của đường dim sẽ không có ( hjx, tại em vẽ cai file minh họa láu quá, nếu bác không sửa cái này cũng đã quá tốt cho em rồi).

    - Khi tỉ lệ cái TEXT của dim nguồn và dim đích quá chênh lệch nhau thì cái điểm gốc của text nó vẫn bị giữ nguyên

    ......VD: Khi text của dim đích to gấp khoảng 10 hoặc 20 lần text của dim nguồn thì khi chạy lệnh xong, vị trí TEXT của dim đích là rất xa đường dim. Và ngược lại nếu TEXT của dim đích quá nhỏ so với TEXT của dim nguồn thì nó sẽ đè lên đường đim ( mong bác fix lại cho khoảng cách của TEXTđường đim luôn nằm trong khoảng 1/3 chiều cao của TEXT).

    3. Bác giúp em bỏ cái alert đi được không, tại nó làm mình phải thêm 1 thao tác bấm OK ( he, em lười quá, nhưng khi làm với nhiều bản vẽ cũng khá mệt )

     

    EM cảm ơn bác rất nhiều !!! *****

     

    :D Chúc mọi ngươi một quốc khánh vui vẻ :D


  4. Em Chào các bác.

     

    CHả là thế này: em hay vẽ trong Model ( ko phải layout) của Cad theo tỷ lệ 1:1 rồi Scale khung vẽ. Thế nên việc chỉnh text_hight và text_dim khi in trên khổ giấy A3 rất mệt. hjx

     

    Em muốn nhờ các bác viết hộ em cái Lisp như thế này để khi in bản vẽ nhìn text và dim nó đều nhau.

     

    - Text, dim nguồn: Giả sử có

    Text: text1 có style là T1 text_hight là A1.

    text2 có style là T2 text_hight là A2.

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

    textn có style là Tn text_hight là An.

     

    Dim: Dim1 có style là D1 text_hight là D1.

    Dim2 có style là D2 text_hight là D2.

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

    Dimn có style là Dn text_hight là Dn.

     

    Các bước của lệnh là:

     

    B1: Chọn text và dim nguồn:

     

    B2: Chọn text và dim đích:

    Xử lý:

    Với Text : Bất cứ Text đích nào Có Style Giống với style của text nguồn thì chuyển text_hight của Text đích = text_hight cuả text nguồn.

     

    Với Dim :Bất cứ Dim đích nào Có Style Giống với style của Dim nguồn thì chuyển

    Dim _hight của Dim đích = Dim_hight cuả Dim nguồn.

    B3: Kết thúc.

     

    Lưu ý: Với Dim đích có những dim bị sửa factor ( bị scale bản vẽ phải chỉnh lại factor).thì chỉ chuyển chiều cao của text,

    - Khi chọn nguồn và đích có thể có lẫn cả line, arc , poline......và Block. Nếu đích có Block thì cũng chỉnh sửa luôn chiều cao của text và dim trong block này như nguồn luôn.

     

    P/s: Các text và dim nguồn ở bên trong 1 block các bác nhé

     

    Mong các bác giúp minh mình nhé Cảm ơn các bác nhiều. Chúc mọi người 1 tuần làm việc vui vẻ

    Còn đây là File minh họa của mình:

    http://www.mediafire.com/?0989patwozh43mc


  5. Chào bạn nguyentuyen6,

    Bạn lưu ý trong đoạn lisp bạn viết có lỗi như sau:

    1/- Tên biến của bạn không thống nhất trên toàn bộ chương trình. Cùng một biến mà bạn đặt cho nó quá nhiều tên nên rất dễ nhầm lẫn. Cái biến diemchuan đó của bạn chính là bien d9uoc nhập vào từ hàm con (nhapsolieu) . Sang hàm con (vecot...) nó chính là cái biến toan cục E. Vậy nhưng khi thực liện lệnh line thì bạn lại coi nó là biến p1 trong khi bạn không hề định nghĩa cho cái biến p1 này là gì. Do vậy cái lệnh này nó không chịu vẽ vì không tìm được biến p1 và thế là toàn bộ cái công sức chạy lisp từ đầu đến đây thành công cốc.

    Ngay cả khi bạn vô tình đã có điểm p1 thì lại dính đòn ở cái biến chuan trong hàm con (vecot ...... chuan) ở chương trình chính vì lisp cũng chả biết cái biến chuan này là cái của nợ gì.

    Vì thế để có thể chạy được lisp này bạn phải: Hoặc là tạo thêm các hàm để định nghĩa lại các biến này cho thống nhất, hoặc là bạn tự chọn lấy một cái tên khoai khoái và giũ nó thống nhất trong chương trình của bạn.

    Chúc bạn vui.

     

    Cảm ơn bạn nhe. Mình đã sửa được rồi.

     

    Mình cũng sửa lại lisp như sau (có thêm 1 tý ):

     

    ;; free lisp from cadviet.com
    (defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
    
    ;;;----------------------------------------------------------------
    
    (defun KetThucVe() (setvar "osmode" OldOs) (princ))
    
    ;;;----------------------------------------------------------------
    
    (defun NhapSoLieu()
    
    (setq
    ;; A
       cao (getreal "\nCao cot: ")
    ;; B
       rongnhat (getreal "\nDuong Kinh to nhat: ")
    ;; C
       diemchuan (getpoint "\nDiem chuan: ")
    
    )
    
    )
    
    ;;;----------------------------------------------------------------
    
    (defun VeCot ( A B C / p2 p3 p4 p5 p6 p7 p8 p9 p10 p61 p71 p81 p91 p101 OldOs)
    
    (setq
    
       p5 (polar C (/ pi 2) A)
    
       p6 (polar p5 0.0 (* B 0.3))
    
    p61 (polar p5 pi (* B 0.3))
    
       p10 (polar C 0.0 (* B 0.38))
    
    p101 (polar C pi (* B 0.38))
    
       p2 (polar C (/ pi 2) (/ A 15))
    
       p3 (polar C (/ pi 2) (/ A 7))
    
       p4 (polar C (/ pi 2) (* A 0.6667))
    
       p8 (polar p3 0.0 (* B 0.5))
    
    p81 (polar p3 pi (* B 0.5))
    
       p7 (polar p4 0.0 (* B 0.42))
    
    p71 (polar p4 pi (* B 0.42))
    
       p9 (polar p2 0.0 (* B 0.455))
    
    p91 (polar p2 pi (* B 0.455))
    
    
    )
    
    (BatDauVe)
    
    (command "line" p6 p7 p8 p9 p10 p101 p91 p81 p71 p61 "c")
    
    (KetThucVe)
    
    )
    
    ;;;----------------------------------------------------------------
    
    (defun C:VeCot (/ cao rongnhat diemchuan)
    
        (NhapSoLieu)
    
        (VeCot cao rongnhat diemchuan)
    
    )
    
    ;;;----------------------------------------------------------------

     

     

    cho mình hỏi thêm là:

     

    Ca^u 1:

     

    Khi viết:

     

    (defun VeCot ( A B C / p2 p3 p4 p5 p6 p7 p8 p9 p10 p61 p71 p81 p91 p101 OldOs)

     

    Thi` A B C nó tự nhận lần lượt 3 tham số của đoạn này ah:

     

     

    (defun NhapSoLieu()

     

    (setq

    ;; A

    cao (getreal "\nCao cot: ")

    ;; B

    rongnhat (getreal "\nDuong Kinh to nhat: ")

    ;; C

    diemchuan (getpoint "\nDiem chuan: ")

     

     

     

     

    Câu 2: Mình muốn cho đoạn p6,p7,p8,p9,p10 chuyển thành SPLINE thay cho LINE thì phải dùng lệnh SPLINE như thế nào

    . Vì khi muốn dừng lệnh SPLINE phải ấn Space 3 lần mới đẹp. (Chuyển 4 đoạn thẳng nối p6,p7,p8,p9,p10 thành 1 SPLINE tạo bởi 5 điểm p6,p7,p8,p9,p10)

    untitled-2.jpg

     

     

     

    CẢm ơn bạn rất nhiều.


  6. Các bạn sửa giúp mình cái líp này nhé. Mình dựa theo cái lisp cua bác ssg

     

    (defun BatDauVe() (setq OldOs (getvar "osmode")) (setvar "osmode" 0))
    
    ;;;----------------------------------------------------------------
    
    (defun KetThucVe() (setvar "osmode" OldOs) (princ))
    
    ;;;----------------------------------------------------------------
    
    (defun NhapSoLieu()
    
    (setq
    
       cao (getreal "\nCao cot: ")
    
       chan (getreal "\nDuong kinh chan cot: ")
    
       dau (getreal "\nDuong kinh dau cot: ")
    
       rongnhat (getreal "\nDuong Kinh to nhat: ")
    
       diemchuan (getpoint "\nDiem chuan: ")
    
    )
    
    )
    
    ;;;----------------------------------------------------------------
    
    (defun VeCot ( A B C D E / p2 p3 p4 p5 p6 p7 p8 p9 p10 OldOs)
    
    (setq
    
       p5 (polar E (/ pi 2) A)
    
       p6 (polar p5 0.0 (/ B 2))
    
       p10 (polar E 0.0 (/ C 2))
    
       p2 (polar E (/ pi 2) (/ A 17))
    
       p3 (polar E (/ pi 2) (/ A 6))
    
       p4 (polar E (/ pi 2) (/ A (/ 3 2)))
    
       p8 (polar p3 0.0 (/ D 2))
    
       p7 (polar p4 0.0 (/ A 21))
    
       p9 (polar p4 0.0 (/ A 20))
    
    
    )
    
    (BatDauVe)
    
    (command "line" p1 p6 p7 p8 p9 p10 "c")
    
    (KetThucVe)
    
    )
    
    ;;;----------------------------------------------------------------
    
    (defun C:Cot (/ cao chan dau rongnhat diemchuan)
    
        (NhapSoLieu)
    
        (VeCot cao chan dau rongnhat chuan)
    
    )
    
    ;;;----------------------------------------------------------------

     

     

    toàn bị báo lỗi

     

    Diem chuan: ; error: bad argument type: 2D/3D point: nil

×