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

tdvn

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

    137
  • Đã tham gia

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

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


  1. 9 giờ trước, Nguyen Hoanh đã nói:

    Bạn viết có dấu như thế nào?

    Mình copy để nguyên thì được nhưng sửa thành có dấu khi load lên nó mất luôn.

    Ví dụ dòng màu đỏ bên dưới (trong file mnu mình làm ngày xưa cũng bị vậy, nếu dùng ABC thì được nhưng unicode thì mất luôn)

     

    ID_BTK [&Chen bang thong ke thep BTK]_btk
    ID_TK [&Thong ke thep TK]_tk
    [--]
    ID_BD [Dóng đường kích thước BD]_bd
    ID_CD [Cat chan duong kich thuoc CD]_cd
    ID_DD [Tinh tong chieu dai cac DIM TD]_td
    [--]
    ID_Tyle [Thay doi BK duong tron truc TL]_tl
    ID_Truc1 [Ve truc 1,2.. truc1]_truc1
    ID_Truca [Ve truc A,B.. truca]_truca
    [--]
    ID_Joint [Line --> Polyline J]_j
    ID_Scale1chieu [scale 1 chieu XSC]_XSC
    ID_MH [LK cac hatch thanh 1 doi tuong MH]_MH
    ID_OT [Ve text dang vong tron OT]_ot
    [--]
    ID_DUONGHAN [->Ve duong han]
    ID_D1 [Duong han nha may, thay D1]_d1
    ID_D2 [Duong han nha may, khuat D2]_d2
    ID_D3 [Duong han cong truong, thay D3]_d3
    ID_D4 [<-Duong han cong truong, khuat D4]_d4
    [--]
    ID_DFIN [Ky hieu mat cat ----- N ----- Dfin]_dfin


  2. Mình sd cú pháp (setq ss (ssget)) để chọn một số đối tượng , trong đó có một số block tên "truranh"

    Nếu mình muốn lọc tập hợp các block "truranh" trên (trong biến ss) ra một biến khác thì làm thế nào.

    Mình đã thử làm như sau nhưng kg đc, các bạn chỉ giúp. Cám ơn

    (setq ss (ssget))

    (command "_.select" ss "")

    (setq ss1 (ssget "p" '((0 . "insert") (2 . "truranh"))))

    Mình nghỉ bạn làm như vậy là đúng rồi


  3. Cảm ơn các bạn đã giúp mình hiểu hơn về kiểm tra dữ liệu việc đó sẽ giúp mình khắc phục và tìm ra lỗi của chương trình.

    Thanks

    Trong lisp, kiểu của biến kg đc định nghĩa trước và cũng có thể thay đổi khi gán lần cuối cùng. Có nghĩa là cùng một biến x bạn có thể gán kiểu int, float, string ..., kiểu của biến là kiểu của trị đc gán cuối cùng cho biến đó. Ví dụ (setq x 5 x 5.0 x "5.0") đều đc. Tuy nhiên khi kiểm tra (type x) -> STR.


  4. Nhờ các Bác coi hộ dùm em cai file duoi ARC ARX bản đồ 299 với, thank các Bác nhiều.

    Có lẽ bạn nhầm rồi. File có đuôi ARX trong cad là file chương trình viết bằng VC biên dịch thành file *.ARX. Còn file của bạn là file dữ liệu của một phần mềm nào đó có lẽ là Arcinfo


  5. bác ơi, ý của em là nếu 4 điểm gần nhau tạo thành 1 tứ giác mà ở trong tứ giác đó không có 1 điểm nào thì bác cứ chia đôi tứ giác đó thành 2 tam giác sao cho 2 phần tương đối bằng nhau ấy mà, giống như em bẻ miếng bánh đa làm đôi chỉ cần nhìn thấy gần bằng nhau là được bác ạ. mà bác cứ nối tất cả các điểm lại với nhau để tạo thành một lưới tam giác giống như cái giàn mướp nhà em ý mà, nếu bác nối tạo thành các tam giác có diện tích không đều nhau thì cũng giống như cái giàn mướp đan không đều nên giàn mướp rất yếu, vậy nhé bác hểu ý em chứ. nhờ bác và các anh em diễn đàn giúp em nhé

    Hình như bạn đang muốn làm mô hình số địa hình để vẽ đường đồng mức. Nếu đúng như vậy thì đây là đề tài hay và khó. Có thể một số phần mềm về bản đồ đã làm vđ này. Nếu bạn muốn làm thì kg đơn giản đâu.

    Theo cách nghĩ thông thường thì với một tập hợp điểm ta sẽ có nhiều đáp án khi tạo lưới tam giác, theo mình nghĩ yêu cầu của bài toán này đặt ra là tổng chiều dài cạnh các tam giác càng nhỏ càng tốt và chúng kg cắt nhau.

    Với một tập hợp tỷ tỷ điểm mà tạo thành một lưới tam giác với điểu kiện tổng các cạnh tam giác là nhỏ nhất và cạnh của chúng không cắt nhau xem ra rất khó. ?!?!?!


  6. hay quá anh tdvn ah,bg em mới biết về cái dlmr mà anh nói.em sẽ tìm hiểu thêm về nó, có gì mong a tiếp tục giúp đỡ.

    còn về cái hàm entupd sao em vẫn không làm được vậy.cụ thể là: trong dimension style em chọn text style là standard, sau đó em vào text style (lệnh tắt là st) thay đổi chiều cao chữ. thì chiều cao chữ chưa thay đổi trên màn hình,nếu em chọn đối tượng sau đó gán cho nó kiểu dim vừa thay đổi nó mới cập nhật lại. em muốn dùng hàm entupd trong trường hợp này thì phải làm ntn.a có thể nói cụ thể cách dùng hàm trong ví dụ này hộ em.cảm ơn anh nhiều.

    Hàm entupd luôn dùng sau hàm entmod. Đối với một số đối tượng, đôi khi hàm entmod chỉ thay đổi dữ liệu nhưng kg thể hiện sự thay đổi đó ra màn hình thì hàm entupd ép cad thể hiện sự thay đổi đó ngay. Hàm entupd chỉ có tác dụng khi các đối số cung cấp cho hàm entmod đúng, tức dữ liệu do hàm entmod cung cấp đã đc cad chấp nhận. Công việc của mình kg dùng dimension nên cũng chưa dùng hàm entmod và entupd cho loại này. Bạn tìm hiểu thêm có gì cứ trình bày sẽ có nhiều bạn am hiểu về dimension giúp bạn.


  7. ah cho em hỏi thêm: lisp có hỗ trợ hàm nào để thêm thông tin về đối tượng theo ý của mình không.

    ví dụ như: các thông tin của đường dimangular có thông tin về góc của đối tượng, em muốn thêm thông tin về chiều dài của đối tượng có được không.

    còn nữa, có phải nếu thông tin thêm vào đối tượng mà không đúng:vd nếu đường line em thêm vào thông tin chiều dài của đối tượng nhưng không thỏa mãn với tọa độ điểm đầu và điểm cuối của đối tượng(nghĩa là chiều dài thêm vào không đúng với chiều dài thật) thì cad sẽ thể hiện đối tượng ntn?

    Hàm entupd dùng như sau : entupd(name);

    Muốn thêm dữ liệu vào đối tượng bạn tham khảo dữ liệu mở rộng, mỗi đối tượng có thể mang theo 16K dữ liệu, dữ liệu này kg ảnh hưởng, kg làm thay đổi đối tượng. Trên diễn dàn đã có, bạn tìm thử xem. Sau đây là một số hàm về dữ liệu mở rộng (dlmr):

    ;Lấy dlmr

    (defun laydlmr( tendlmr tendt / ent)

    (setq ent (entget tendt (list tendlmr)))

    (setq ent (cdr (cadr (cadr (assoc -3 ent)))))

    )

    ;Tạo dlmr

    (defun taodlmr( tendt code tendlmr dl / ent loai)

    (if (null (tblsearch "APPID" tendlmr)) (regapp tendlmr))

    (setq ent (entget tendt (list tendlmr)))

    (setq loai (cons code dl))

    (if (null (assoc -3 ent))

    (progn

    (setq ent (append ent (list (list -3 (list tendlmr loai)))))

    (entmod ent)

    ))

    )

    ;Thay đổi dlmr

    (defun t-doidlmr(tendt code tendlmr dl / ent entold entnew loai)

    (if (tblsearch "APPID" tendlmr)

    (progn

    (setq ent (entget tendt (list tendlmr)))

    (setq loai (cons code dl))

    (setq entold (assoc -3 ent))

    (setq entnew (list -3 (list tendlmr loai)))

    (entmod (subst entnew entold ent))

    )

    (taodlmr tendt code tendlmr dl)

    )

    )

    ;Nối thêm dlmr kiểu string

    (defun noi-dlmr( tendt code tendlmr dl / data)

    (setq data (laydlmr tendlmr tendt))

    (if (and data (<= (cpos data dl) 0))

    (progn

    (setq dl (strcat data " " dl))

    (t-doidlmr tendt code tendlmr dl)

    )

    (taodlmr tendt code tendlmr dl)

    )

    )


  8. không phải entmod của em không dùng được mà là sau khi entmod thông tin của đối tượng đã thay đổi, nó trả lại kết quả là danh sách liên hợp có những thông số thay đổi nhưng nó không thể hiện trên bản vẽ.

    Có một số loại đối tượng kg cập nhật ngay mà sau khi save và mở lại bản vẽ mới thấy hoặc bạn dùng hàm entupd để buộc cad cập nhật ngay cho bạn

    • Vote tăng 1

  9. Các bác Pro à, Chắc bài toán san nền thì nhiều người gặp phải. Nhưng 1 Lisp phục vụ hữu ích cho việc đó 1 cách đơn giản thì chưa hẳn đã nhiều người biết. Loay hoay viết mãi, Em cũng viết được 1 cái cho riêng mình. Nhưng lisp đó chỉ mang tính chất cục bộ mà không tổng quát. Em đưa đầu bài tổng quát để cả nhà cùng giải nhé.

    Bài toán san nền:

    Cao độ thiết kế là A

    cao độ tự nhiên( Mặt đất hiện trạng) là B

    Trước khi san nền, bóc bỏ toàn bộ mặt đất hiện trạng đi 1 bề dày bằng C

    Kẻ lưới chia ô khu đất cần san nền, kích thưóc mắt lưới tùy chọn ( Thường là 5mx5m )

    TRên các nút của mắt lưới, ta có các text A,B, (A-:cheers:

    tại chính giữa ô lưới là thông số về diện tích ô, khối lượng đào, đắp.

    Ban đầu, ta phải pick tay diện tích ô đất, trừ thủ công ra con số (A-:cheers:

    Yêu cầu, Dựa vào hiệu (A-:cheers: để tính được khối lựợng san nền của các ô, trong các trường hợp ô là hình chữ nhật, là hình tam giác.

    Bài toán này tưởng chừng phức tạp nhưng thật ra rất đơn giản. Mong các bác Pro quan tâm giúp đỡ.

    đây là file em làm, File này chưa làm chính xác 100% nên các bác đừng cười em nhé !

    http://www.cadviet.com/upfiles/2/san_nen_1.dwg

    Code lisp tính giá trị trung bình:

    (defun c:snn ()

    (prompt "\nChon text de tinh trung binh cong:")

    (setq ss (ssget '((0 . "TEXT")))

    sl (sslength ss)

    kqua 0

    )

    (while (and ss (> (sslength ss) 0))

    (setq

    kqua (+ kqua

    (atof (cdr (assoc 1 (entget (setq ent (ssname ss 0))))))

    )

    )

    (ssdel ent ss)

    )

    (setq kqua (/ kqua sl))

    (princ kqua)

     

    (setq obj (vlax-ename->vla-object

    (car (entsel "\nChon text de ghi ket qua:"))

    )

    )

    (vla-put-TextString obj (rtos kqua 2 2))

    )

    Bạn sưu tầm líp trên diễn đàn xem đã có những gì bạn cần chưa. Nếu đã có bạn hãy dùng và nêu ra những gì chưa có để mọi người giúp


  10. Bác SSQ ơi cho em hỏi 1 chút, giữa lisp vc đầu và lisp vc sau có khác nhau 1 điểm là tọa độ cột X và cột Y được đổi chổ cho nhau. Vậy khi muốn thay đổi như thế thì em phải thay dòng lệnh nào, vì em không biết lisp nên có dow 2 lisp Vc về để so sánh thì 2 lisp có cấu trúc khác nhau? Em có 1 lisp cũng được chỉnh sữa rồi cũng tương tự như lisp VC của Bác nhưng cái lisp của em thì nó vẫn bị ngược cột tọa độ X và Y. Mong nhận đuợc sự hồi âm sớm nhất của Bác!

    Đây là lisp của em. Và tiện thể Bác có thể giải thích dùm em vì sao mà font chử Bảng Tọa Độ Góc Ranh nó bị lỗi không ạ, em dùng Font VIN.

    Mình Thấy font lisp trên chạy bình thường. Tuy nhiên, số hiệu điểm được đánh nhiều hơn gấp đôi số cần có. Ví dụ có 4 đỉnh thì nó đánh từ 1 đến 8 nên từ điểm 5 lại trùng với 1. Mình nghỉ, kg biết bạn xuandao có chỉnh gì kg, nếu đây là lisp trích từ nguồn cadviet, tác giả nên chịu khó chỉnh lại trường hợp số hiệu điểm trên. Còn việc đổi x thành y hay ngược lại kg có gì khó


  11. Hiện mình đang ở Tân Bình, địa điển học ở đâu trong phạm vi TP là được và mình chỉ có thế học vào ban đêm nên hơi khó kiếm lớp. Mình mới chuyển đến Tp. HCM được có 01 tuần nên ko rành lắm, Bữa hôm trước mình có qua bên ĐH BK, ĐH GTVT hỏi rồi nhưng vẫn chưa tìm được lớp học phù hợp với mình, rất mong được các bạn chỉ giáo.

    Ở TP HCM mà kg tìm đc chỗ học cad quả là lạ, thế bạn học cad 2D để phục vụ cho việc gì vậy


  12. tại vì em mới biết lisp gần đây thôi, em cũng chưa học được nên phải làm thủ công thế. bác có thể chỉ cho em bài viết nào liên quan về vấn đề này không. cám ơn bác nhiều

    Mình vừa tìm đc đoạn code này. Có thể còn nhiều nữa.

    ;TEXTOUT.LSP By: Jeffery P. Sanders
    ;This program gets text from an AutoCAD drawing and writes it to a text file.
    
    ;define program - listing your variable names here 
    ; resets them to nil after the program finishes	
    (defun C:TEXTOUT(/ lts ernote filen fil eset en enlist cntr)
    
    ;turn echo off
     (setvar "cmdecho" 0)
    
    ;get ltscale (Note: ltscale should always equal dimscale)
     (setq lts(getvar "ltscale"))
    
    ;set the exit note to successful
     (setq ernote "\n....TextOut Complete.")
    
    ;use dialog box to set file name / the 1 allows
    ;the user to type in a new file name
    ;the "txt" sets the default to be "*.txt"
     (setq filen
    (getfiled "Type or Select Text File Name" "" "txt" 1)
     )
    
    ;open file to write
     (if (setq fil(open filen "w"))
    
      ;progn necessary for multiple statements inside an if statement
    (progn
    
     ;if ssget returns a valid selection set
      (if (setq eset(ssget))
    
       ;progn necessary for multiple statements inside an if statement
    	(progn
    
    	 ;set the entity counter to zero [the first entity in a set is zero]
    	  (setq cntr 0)
    
    	 ;step through each entity in the selection set
    	  (while (< cntr (sslength eset))
    
    	   ;get the entity name indexed by cntr
    		(setq en(ssname eset cntr))
    
    	   ;get the DXF group codes for the entity
    		(setq enlist(entget en))
    
    	   ;check the group code 0 to see if entity type = TEXT
    		(if(= "TEXT" (cdr(assoc 0 enlist)))
    
    		 ;progn necessary for multiple statements inside an if statement
    		  (progn
    
    		   ;get the text string from the entity's DXF Group Code 1
    			(setq str(cdr(assoc 1 enlist)))
    
    		   ;print the string to the command line
    			(princ (strcat "\nOutput To File: " str))
    
    		   ;print the string to the file
    			(princ (strcat "\n" str) fil)
    
    		  );close the if progn
    
    		);close the if statement
    
    	   ;increment the counter to get the next entity
    		(setq cntr(+ cntr 1)) 
    
    	  );close the while loop
    
    	 ;close the text file
    	  (close fil) 
    
    	);close the if progn
    
       ;set the exit note as an error
    	(setq ernote "\nError - No Entities Selected.")
    
      ); close the if statement
    
    );close the if progn
    
      ;set the exit note to be an error
    (setq ernote (strcat "\nError - Could not create File: " filen))
    
     );close the if statement
    
    ;turn the command echo back on
     (setvar "cmdecho" 1)
    
    ;print the exit note to the command line
     (princ ernote)
    
    ;clear the command line
     (princ "\n ")
    
    ;supress last echo
     (princ)
    
    );close the program

    • Vote tăng 1

  13. thế thì bây giờ nó lại thêm dấu "" nữa, có bỏ được không bác, với lại file em up lên, với 2 chuỗi 1:1.5 , vậy pick 2 chuỗi kết quả lại khác nhau, bác thử xem hộ em cái. em thì toàn dùng cách này để lấy ký tự qua excel thôi, em chưa biết cách nào khác, em thấy cái này cũng tiện rồi nên không tìm cách khác.

    Muốn không có """" bạn thay thề đoạn (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))

    thành (if (setq n (nentselp p)) (princ (strcat "\n" (Cdr (assoc 1 (entget (car n)))))))

     

    Còn cách chuyển text qua file như bác là quá thủ công. Người ta có thể chuyển qua file dạng text một lúc tất cà các text bạn chọn, mỗi text trên một dòng hoặc muốn theo thứ tự như bác chọn từng đối tượng cũng đc nhưng viết lisp còn dễ hơn cái bác muốn hiện nay. Trên diễn đàn này đã có xử lý về vấn đề này rồi

     

    Mình đã xem cái file của bạn. Hai mtext của bạn là 2 chuỗi có dữ liệu khác nhau, bạn xem đoạn màu đỏ :

     

    Select object: ((-1 . <Entity name: 4007b410>) (0 . "MTEXT") (330 . <Entity

    name: 40079cf8>) (5 . "152") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .

    "0") (100 . "AcDbMText") (10 24.501 24.0719 0.0) (40 . 10.0) (41 . 62.3505) (71

    . 1) (72 . 5) (1 . "{\\H0.75x;1:1.5}") (7 . "Standard") (210 0.0 0.0 1.0) (11

    0.824469 0.565908 0.0) (42 . 20.0) (43 . 10.0) (50 . 0.601534) (73 . 1) (44 .

    1.0))

     

    Select object: ((-1 . <Entity name: 4007b418>) (0 . "MTEXT") (330 . <Entity

    name: 40079cf8>) (5 . "153") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 .

    "0") (100 . "AcDbMText") (10 203.771 24.7784 0.0) (40 . 7.5) (41 . 62.3505) (71

    . 3) (72 . 5) (1 . "1:1.5") (7 . "Standard") (210 0.0 0.0 1.0) (11 0.828738

    -0.559637 0.0) (42 . 20.0) (43 . 7.5) (50 . 5.68924) (73 . 1) (44 . 1.0))

     

    Bạn thấy lisp cho 2 kết quả khác nhau là đúng rồi vì thực tế hai mtext của bạn nó khác nhau.

    Việc hai đối tượng mtext có dữ liệu khác nhau nhưng nhìn thấy trên màn hình giống nhau thì mình không rõ lắm, vì công việc của mình không dùng mtext nên không hiểu sâu lắm. Có thể các bạn trên diễn đàn hiểu rõ về mtext sẽ trả lời cho bạn.


  14. bác tdvn thật nhiệt tình, em thử rồi nên góp ý chút ít:

    -lisp của bác nataca hay ở chỗ khi mình pick điểm thì nó không hiện chữ pick ở đầu, điều này có lợi khi muốn copy sang excel. cái này hay.

    -lisp của bác nataca lại pick điểm khó trúng hơn của bác tdvn, có lẽ do 1 người dùng ô vuông, 1 người dùng chữ thập để pick điểm. cái này hay.

    -lisp của bác nataca khi pick trật thì xem như không pick (vì cad không thực hiện lệnh nào hết), cái này cũng hay.

    -file em up lên các bác xem thử, cùng là mtext mà sao pick 2 cái lại ra khác nhau

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

     

    2 lisp của 2 bác mà kết hợp được như thế thì tiện nhiều lắm. thank các bác

    Muốn không hiện chữ Pick, bạn chỉ cần sửa (getpoint "\nPick : ") thành (getpoint)

    và chữ "princ" thành "print" trong đoạn (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))

    Tuy nhiên, muốn copy sang excel, có nhiều cách hay hơn như có bạn đã đề cập


  15. Mấy hôm nay cũng hơi bận nên ít vào diễn đàn với lại không nhớ trong đề tài này mình có viết lisp nên không trả lời cho các bạn. Thành thật xin lỗi. Vấn đề này các bạn cũng đã giải quyết đc rồi tuy nhiên mình cũng gởi đoạn lisp do mình viết để các bạn tham khảo. Đoạn này mặc định là text, nếu là mtext hay các thứ khác và muốn kiểm tra loại đối tượng thì phải viết thêm tí nữa

     

    (setq kt T)

    (initget 128)

    (while (and kt (setq p (getpoint "\nPick : ")))

    (cond

    ((listp p)

    (if (setq n (nentselp p)) (princ (Cdr (assoc 1 (entget (car n))))))

    )

    ((= (type p) 'STR) (setq kt nil))

    (T (setq kt nil))

    )

    (initget 128)

    )

    (princ)

    • Vote tăng 2

  16. Ký tự tab rất khó phát hiện, làm thế nào Bác biết được chỉ giúp mình với.

    Đơn giản thôi mà. Khi bạn đang trong một trình soạn thảo đơn giản, như nodepad chẳng hạn. Ngay tại dòng trống, bấm phím "End", nếu không có ký tự nào thì "con nháy" vẫn đứng ở đầu dòng, nếu có ký tự khác thì "con nháy" sẽ chạy đến cuối dòng ...

×