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

thiep

Thành viên
  • Số lượng nội dung

    514
  • Đã tham gia

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

  • Ngày trúng

    48

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


  1. Documents có s, bạn copy dưới đây :

     

    (defun C:openfile ()

    (setq docs-coll (vla-get-Documents

    (vlax-get-acad-object)

    )

    )

    (setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))

    (vla-activate file-opened)

    )

    Q288, cảm ơn bạn.

    Thật là đôi khi cũng ngớ ngẩn vì một 1 lỗi nhỏ mà cũng không phát hiện ra.


  2. Chào thiep

    Bạn copy&paste vào command line:

    (vla-open (vla-get-documents (vlax-get-acad-object)) "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")

    Hay

    (defun c:openFile ()
     (vl-load-com)
     (setq docs-coll (vla-get-Documents (vlax-get-acad-object)))
     ; open hop thoai Select File
     (setq file-to-open (getfiled "FILE TO OPEN"  ""  "dwg" 16))
     ;(setq file-to-open "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg")
     (setq file-opened ( vla-open docs-coll file-to-open))
     (vla-activate file-opened)
     )

    Gia_bach, cám ơn bạn.

    khi copy&paste vào command line, thì lệnh OK ngay, tuy nhiên bản vẽ chưa hiện hành

    Nhưng khi tạo Lisp thì báo lỗi:

    error: Automation Error. Invalid execution context

    ???


  3. không phải là vla-get-ActiveDocument vì ActiveDocument là bản vẽ hiện hành, còn vla-get-Documents quản lý tất cả các bản vẽ,

    chỉ có Documents mới có quyền gọi bản vẽ mới thôi chứ bản vẽ này đâu có quyền gọi bản vẽ khác.

    Hai cái đó là 2 object riêng biệt.

    Xin lỗi, Tôi bỏ Active nhưng vẫn báo lỗi:

    error: ActiveX Server returned the error: unknown name: Document

    Lisp được viết lại như sau:

    (defun C:openfile	()
     (setq	actDoc (vla-get-Document
    	 (vlax-get-acad-object)
           )
     )
     (setq file-opened (vla-open docs-coll "C:\\Program Files\\AutoCAD 2007\\Sample\\Lineweights.dwg"))
     (vla-activate file-opened)
    )


  4. Bạn chuyển qua VL như sau:

     

    (setq file (vla-Open (vla-get-Documents (vlax-get-acad-object)) "C:\AutoCAD\Sample\city map.dwg"))

    Khi đó file đã mở nhưng chưa phải là file hiện hành, bạn thêm

    (vla-Activate file)

    thì file đó mới trở thành file hiện hành.

     

    Theo sự hướng dẫn của q288, thiep vẫn chưa mở file được, đoạn mã viết như sau:

    (defun C:openfile ()
     (setq	actDoc (vla-get-ActiveDocument
    	 (vlax-get-acad-object)
           )
     )
     (setq file (vla-Open
       actDoc
       ("C:\Program Files\AutoCAD 2007\Sample\Lineweights.dwg")
     )
     )
     (vla-Activate file)
    )

    Xin g288 chỉ giáo thêm.


  5. Cho Thiep hỏi:

    Có đoạn lisp nào dùng để mở 1 hay nhiều file DWG đang tồn tại không? Tôi đọc trên Help, có nói đến phương thức OPEN trong 1 đoạn mã VBA ví dụ như sau:

     

    Sub Example_Open()

    ' The following example opens "C:\AutoCAD\Sample\city map.dwg" file.

    ' This drawing may not exist on your system. Change the drawing

    ' path and name to reflect a valid AutoCAD drawing on your system.

     

    ThisDrawing.Application.Documents.Open ("C:\AutoCAD\Sample\city map.dwg")

     

    End Sub

    Thiep chịu bó tay, không hiểu làm sao để chuyển qua mã VL được. Nhờ các anh em chỉ giáo


  6. Các anh ơi, có lisp nào để ghi lại độ dài của đường line hoặc polyline không ạ. Ý em là khi mình dùng lisp thì chỉ cần click chuột vào đối tượng cần đo độ dài thì sẽ tự động hiện giá trị qua text, và vị trí của text này được mình xác định qua lần click chuột thứ hai (em diễn đạt lủng củng quá, chẳng biết mọi người có hiểu không :lol2: )

    Bạn vào đây tham khảo:

    http://data1.cadviet.com/sumCURVE_1.lsp

    • Vote tăng 1

  7. Chào anh Kha Anh Tú và chị Hà Anh. Em nói câu này có khi không phải mong anh chị bỏ quá cho em. Trên diễn đàn CADVIET ta có 39.521 thành viên chính thức. Khi đọc bài viết của Anh Tú và chị Hà Anh như thế thì 39251 thành viên sẽ nghĩ gì. Nói thiệt với anh chị mong anh chị đừng giận : em là thành viên mới thì em đã thấy không được huống chi là các thành viên còn lại (39520 thành viên) khi đọc xong thì sẽ nghĩ như thế nào về anh và chị nhỉ?

     

    "Sống trong đời sống cần có một tấm lòng," và để nhiều người thương mình thì khó lắm nhưng để nhiều người ghét thì dễ lắm. Không biết em nghĩ như vầy có đúng không anh Tú? Em nghĩ rằng những bài viết với những lời lẽ không hay thì mình nên tránh là tốt nhất phải không anh?

     

    em là thế hệ đi sau và còn lớp lớp thế hệ đi sau nữa, em rất tôn trọng các anh, chị . Em mong các anh chị hãy làm gương sáng cho lớp đi sau như chúng em noi theo và xin đừng post bài với những lời lẽ không hay như thế. Đôi lời tâm sự cùng anh Tú và chị Hà Anh.

    Mong các anh chị trên diễn đàn hiểu thấu lời em

    Chào thân ái

    Thành viên cũ tán thành ý kiến thành viên mới.

    • Vote tăng 1

  8. Anh Thiệp xem lại cái này giúp em với sao nó chạy mà khong đúng gì hết. Em muốn nó sắp xếp theo thứ tự từ trên xuống thì khi chuyển qua file excel là từ trái sang phải.

    Mà kết quả chẳng đúng, thậm chí còn có cái nó bỏ quên đâu mất.

    Thank!

    http://www.cadviet.com/upfiles/Drawing1_8.dwg

    http://www.cadviet.com/upfiles/khoiluong.txt

    Cad rất nhớ những đối tượng nào bạn tạo ra trước, DT nào tạo ra sau. Khi bạn chọn một bó đối tượng, nó sẽ sắp xếp DT nào bạn tạo ra trước sẽ đưa ra xử lý trước, (sẽ in ra trước trong file *.txt). Còn bỏ quên thì cad không quên đâu, chỉ có trường hợp bạn vừa chọn, vừa pan, zoom cho lớn rõ, những đối tượng đã chọn vượt ra khỏi màn hình, thì cad sẽ quên một số đối tượng không nhìn thấy này. khi chọn xong bạn phải zoom lại màn hình.

    Thiep sẽ thêm một đoạn mã sắp xếp cho bạn. Chờ chút nhé, đang tiếp khách.


  9. Snowman xem lại cái này thử sao vẫn không dung được.

    hôm trước Thiêp có cho mìh cái lisp chạy cũng tốt nhưng mà chưa đúng ý mình lắm, ai biết giúp mình với.

    Mình muốn có một cái lisp nhập khối lượng từ cad qua excel. nó thực hiện như sau:

    - Khi chạy lisp hỏi lưu file (.txt) vào chổ nào.

    - Sau đó quét ký tự text cần nhập, sau khi ent se lưu các text vào file vừa lưu (text nào nằm trênlưu bên trái rồi text nằm dưới lưu bên phải)

    - Rồi tiếp tục chọn các text khác, sau khi ent se lưu tiếp vào file (.txt) trước. (Lưu vào dòng phía dưới của dòng lưu trước)

    - Để kết thúc lênh ấn Esc.

    thanhk!

    Lisp của Snowman, không có sai gì, chạy rất tốt, chỉ có điều khi copy lisp vào CODEBOX, nó bị lỗi ở dòng sau:

    (princ "\nSelect all texts of column (S,L, " alt=cool.gif src="style_emoticons/default/cool.gif" border=0 emoid="B)">: "))

    bạn chỉnh sửa lại:

    (princ "\nSelect all texts of column (S,L,...): ")

    Còn việc đi làm ở CPC ư, rừng thiêng, nước độc, thú dữ, bom mìn ... còn đầy. Đi 2 về 1, còn 1 phải vô bệnh viện! conghoan còn muốn làm đệ tử nữa không?


  10. Lisp của bạn dùng chưa đúng cách nên có lỗi. Bạn phải post lên toàn bộ thì mới kiểm được.

     

    ...

    ptsList là 1 list có các phần tử kiểu double

    Câu lệnh:

    (setq sArray (vlax-safearray-fill arraySpace ptsList))

    sẽ fill các phần tử của ptsList vào mảng arraySpace , sau đó gán cho sArray

    Ndtnv thân,

    Đọc xong, tôi đã hiểu được 1 phần nào cái sArray này. Xin hỏi thêm:

    Giả sử ptsList của tôi là 1 list 6 phần tử chứa tọa độ và tên của các text, đơn giản như sau:

    (((1.0 1.0 0.0) "A") ((1.0 2.0 0.0) "B") ((1.0 3.0 0.0) "C")) ((2.0 1.0 0.0) "D") ((2.0 2.0 0.0) "E") ((2.0 3.0 0.0) "F")))

    trong trường hợp này thì phải khai báo như thế nào?


  11. Mình có 1 kho lisp của Japan hổ trợ vẽ và kiểm tra rất tôt nhưng lại hô trợ dộc quyền cho font Nhật và khung bv mẫu của nó mà thôi giờ mình cũng không thể sd được nếu rảnh các bạn có thể xem và chỉnh sửa dùm mình được ko mong các bạn cadViet có thể hổ trọ cho công việc của mình chân thành cảm ơn nhiều. :lol2:

    Ngôn ngữ Lisp là ngôn ngữ chung mà lận? Tôi đang học tiếng Campuchia để qua làm việc bên đó. Có thể tôi cũng dịch được Lisp của Nhật bổn bằng tiếng Campuchia! Bạn cứ mạnh dạng uploat thử xem?


  12. Bạn thử dùng cái này xem.

    (defun c:cdt()
     (defun dnt(tx)
       (vl-list->string (reverse (vl-string->list tx)))
     )
     (vl-load-com)
     (setq ent  (car (entsel "\nChon text:"))
           eget (entget ent)
    tt1  (cdr (assoc 1 eget))
    ttd  (cdr (assoc 10 eget))
    dn   (dnt tt1)
    tt10 (dnt (substr dn (+ 2 (vl-string-search " " dn))))
    tt11 (dnt (substr dn 1 (vl-string-search " " dn)))
    sc   (substr tt11 1 (vl-string-search "-" tt11)))
     (if (> (setq sc1 (atoi sc)) 0)
       (setq tt12 (strcat tt10 " " (itoa (1+ sc1)) "-" (itoa (1+ sc1))))
       (setq tt12 (strcat tt10 " " (chr (1+ (ascii sc))) "-" (chr (1+ (ascii sc))))))
     (command "copy" ent "" ttd pause)  
     (vla-put-TextString (vlax-ename->vla-object (entlast)) tt12)  
    )
    

    Bạn G288 thân,

    Lisp của bạn chỉ thật tuyệt vời khi dòng text bạn copy chỉ có 1 khoảng trống trước vị trí 1-1 hoặc A-A. Còn nếu nó là 1 - 1 hoặc A - A, thì Lisp của bạn hiểu sai ngay. Thiep có một giải pháp khác: Trên bản vẽ của cựu CT nước, chưa có dòng text "MAT CAT 1-1" nào cả. Cựu CT chỉ gọi lệnh, cho chiều cao text, cad sẽ hỏi tên mặt cắt là số hay chữ, trả lời xong chỉ cần Pick Pick mà thôi. Lisp như thế này đây:

    http://www.cadviet.com/upfiles/ghichuMC.lsp

    Gửi Ducluongx3, khi bạn post bài, nhớ kiểm tra chính tả trước khi post nhé. Khi dùng được lisp nhớ bấm THANK cho mọi người vui

    • Vote tăng 2

  13. Cám on bạn đã tặng Lisp mình đã sửa lại theo ý muốn nhưng vẩn chưa chèn dược kết quả vô text cho trước nhờ bạn hoàn thiện dùm .

    Bạn sửa đoạn này

    (setq ssDd (entsel "\nChon kich thuoc chieu dai: ")

    chieudai (dxf 42 (car ssDd ))

    )

    thành:

    (setq chieudai (getreal "\nChieu dai: "))

     

    Như ý muốn.


  14. Các bác giúp mình viết cái lisp lấy số liệu từ cad đưa qua excel với.

    File cad: http://www.cadviet.com/upfiles/load_2.dwg

    File Excel: http://www.cadviet.com/upfiles/load.xls

    ...

    Mình đang cần gấp lắm bác nào biết giúp mình với nhé. Thank!

    Thật ra dữ liệu cần lấy ra của bạn chỉ là 23 số trong cột (S,L,.. ), còn trong bảng excel đã định dạng sẵn rồi, chờ một chút nhé.


  15. Để gán trị dùng các hàm

    vlax-safearray-fill

    vlax-safearray-put-element ...

    Cách dùng xem help

    Chào bạn ndtnv, bài viết của bạn đã lâu, nhưng đề tài về safearray không cũ chút nào. Tôi đang học cách tạo 1 safearray từ 1 bảng List, nhưng tôi không hiểu gì về cách khai báo kiểu biến. Tôi đã đọc Help nhưng không rõ, Help viết quá ngắn gọn, và không ví dụ nhiều NDTNV có thể giải thích cho tôi cách khai báo từng kiểu cho từng trường hợp nhé:

    0 Uninitialized (vlax-vbEmpty)

    1 Contains no valid data (vlax-vbNull)

    3 Long integer (vlax-vbLong)

    4 Single-precision floating-point number (vlax-vbSingle)

    5 Double-precision floating-point number (vlax-vbDouble)

    9 Object (vlax-vbObject)

    11 Boolean (vlax-vbBoolean)

    Tôi có sưu tầm 1 Lisp do NguyenHoanh sưu tầm, gồm các hàm làm việc với Block, trong Lisp đó có Hàm

    (defun list->variantArray (ptsList / arraySpace sArray)

    (setq arraySpace

    (vlax-make-safearray

    vlax-vbdouble

    (cons 0 (- (length ptsList) 1))

    )

    )

    (setq sArray (vlax-safearray-fill arraySpace ptsList))

    (vlax-make-variant sArray)

    )

    ptsList tôi nghĩ là 1 list của các tọa độ POINT (điểm chèn Block), nhưng khi tôi khai báo 1 list giống như thế thì máy cứ báo lỗi:

    error: vlax-safearray-fill failed. Invalid initialization list. # ((390718.0 1.53408e+006 0.0) (390706.0 1.53409e+006 0.0) ....)

    Nhờ bạn hướng dẫn giùm nhé. Trân trọng.


  16. Cảm ơn bạn đã nhắc nhở! Món này mình cũng muốn học lăm nhưng cũng mới biết nên chưa biết bắt đầu từ đâu nữa. Mình cũng tìm tài liêu nhưng mà tìm không ra, có chỗ nào có tài liệu học bạn có thể chỉ giúp mình với.

    Thank!

    Bản thân tôi cũng mua sách tự học và tham khảo rất nhiều tài liệu trên diễn đàn CADVIET này. Bạn cũng phải cố gắng, không phải 1 ngày, 2 ngày là biết ngay. Đôi khi phải kiên trì vài 3 tháng mới được. Bạn ở Q7 thì xa nhà tôi quá, bạn ở Q. GV thì có gì khó, qua nhà tôi, tôi giúp bạn cùng trao đổi học hỏi.


  17. Mình thành thật xin lỗi vì ban đầu không nói rõ, hôm trước mình chỉ tính các polyline nên mình chỉ chọn polyline nhưng khi dùng thì lại gặp cả các line nữa nên không được, bác sữa hộ mình lần nữa nghe, không những polyline mà các line, arc, hay đường tròn đều tính được.

    Thank!

    Đây là lisp sum của các curve, bạn chỉ cần thêm các tên đưởng: "LWPOLYLINE,LINE,SPLINE,ARC,CIRCLE" là được


  18. Trước giờ em vẫn load các lisp sau để tính khối lượng nạo vét:

    Chào bạn fire_unicorn, Lisp của bạn sưu tầm rất ư là dài dòng, như bạn thanhbinh nói, tôi đọc muốn tắt thở luôn.

    Tuy nhiên, tôi cũng muốn học hỏi thêm, Mục đích của Lisp là tính khối lượng nạo vét. Bạn có thể cho mình biết bản vẽ trước và sau khi thực hiện Lisp được không?. Cái file dữ liệu của bạn là từ đâu ra?

    Biết đâu, tôi sẽ giúp bạn tinh giản lại cái lisp này cho bạn và mọị người tham khảo


  19. Không hiểu mảng bạn nói là gì và ý bạn muốn là giải bài toán hay chỉ đơn giản là từ cái hình bên trái vẽ thành cái hình giống như bên phải,

    nếu chỉ là vẽ thì mình có làm cái lisp sau, kết quả ra cũng giống, chỉ có hình thức hơi khác:

    Ý mình như thế này:

    Tạo mảng có M chiều, mỗi chiều có N phần tử, mỗi phần tử là 1 ký tự, A hoặc B hoặc C ...

    So sánh các phần tử gần kề kể cả trên và dưới. Nếu giá trị 2 phần tử này khác nhau thì vẽ 1 vạch phân cách. sau đó nối chúng lại nhau thành 1 đường Pline phân cách.

    Cảm ơn q288 nhiều.

×