-
Số lượng nội dung
905 -
Đã tham gia
-
Lần ghé thăm cuối
-
Ngày trúng
29
Bài đăng được đăng bởi Thaistreetz
-
-
@ketxu: Mình đã từng thử dùng Express bằng phương pháp sau: Export toàn bộ biến hệ thống của 2 bản vẽ ra file text. Sau đó dùng 1 chương trình so sánh sự khác nhau giữa 2 file này (chương trình kiểu vậy trên mạng có vô số) tuy nhiên vì số lượng biến hệ thống là rất lớn mà cách trên không loại bỏ sự giống nhau giữa chúng nên mới viết lisp này.
-
Đôi khi chúng ta có nhu cầu cần so sánh các thiết lập biến hệ thống giữa 2 bản vẽ xem chúng khác nhau những gì. Đây là lisp mình fát triển từ lisp của bác Doan Van Ha trong bài viết số 2 topic Lisp theo dõi sự thay đổi biến hệ thống trong quá trình vẽ (Topic này cũng do mình lập - em kể công tí :D)
Hướng dẫn sử dụng:
- Bạn cần tải lisp này vào cả 2 bản vẽ cần thực hiện so sánh
- Bản vẽ thứ nhất bạn gọi lệnh Var1. kết quả: nó báo cho bạn "Đã lấy được toàn bộ danh sách và giá trị biến hệ thống của bản vẽ thứ nhất"
- Chuyển sang bản vẽ thứ 2 bạn gõ lệnh Var2. lệnh này làm công việc tương tự như của lệnh var1 là lấy toàn bộ giá trị biến hệ thống của bản vẽ thứ 2. Đồng thời nó thực hiện công việc so sánh với giá trị của các biến hệ thống bản vẽ thứ nhất. Nếu biến nào có giá trị khác nó sẽ thống kê ra màn hình cho bạn.
;Chu y: mot so System Variables khong can quan tam, nhu: "CDATE" "DATE" "LASTPROMPT" "TDINDWG" "TDUSRTIMER" "UNDOCTL"... ;;; Edit by Thaistreetz - Cadviet.com (defun C:var1 nil ; Lenh nay chay o ban ve thu nhat (setq lstvar1 nil) (foreach var lstvar (if (getvar var) (setq lstvar1 (cons (cons var (getvar var)) lstvar1)))) (setq lstvar1 (reverse lstvar1)) (vl-propagate 'lstvar1) (prompt "\nDa lay duoc toan bo thong tin bien he thong ban ve thu nhat") (princ)) (defun C:var2 (/ lstvar2 lv1 lv2 x) ; Lenh nay chay o ban ve thu 2 (if lstvar1 (progn (princ "\n") (foreach var lstvar (if (getvar var) (setq lstvar2 (cons (cons var (getvar var)) lstvar2)))) (setq lv1 (list-exclusive lstvar1 lstvar2) lv2 (list-exclusive lstvar2 lstvar1)) (foreach var lv1 (if (setq x (assoc (car var) lv2)) (progn (princ (car var)) (princ "\t") (princ (cdr var)) (princ "\t") (princ (cdr x)) (princ "\n") (setq lv2 (vl-remove x lv2))) (progn (princ (car var)) (princ "\t") (princ (cdr var)) (princ "\t") (princ "nil") (princ "\n")))) (foreach var lv2 (princ (car var)) (princ "\t") (princ (cdr var)) (princ "\t") (princ "nil") (princ "\n"))) (prompt "khong co danh sach bien he thong cua ban ve thu nhat de so sanh")) (princ)) ; lay cac phan tu khong thuoc giao cua 2 danh sach (defun list-exclusive (lst1 lst2) (if lst1 (if (member (car lst1) lst2) (list-exclusive (cdr lst1) lst2) (cons (car lst1) (list-exclusive (cdr lst1) lst2))))) ;----- System Variables of Cad2007. (setq lstvar (list "3DDWFPREC" "ACADLSPASDOC" "ACADPREFIX" "ACADVER" "ACISOUTVER" "ADCSTATE" "AFLAGS" "ANGBASE" "ANGDIR" "APBOX" "APERTURE" "APSTATE" "AREA" "ASSISTSTATE" "ATTDIA" "ATTMODE" "ATTREQ" "AUDITCTL" "AUNITS" "AUPREC" "AUTOSNAP" "BACKGROUNDPLOT" "BACKZ" "BACTIONCOLOR" "BDEPENDENCYHIGHLIGHT" "BGRIPOBJCOLOR" "BGRIPOBJSIZE" "BINDTYPE" "BLIPMODE" "BLOCKEDITLOCK" "BLOCKEDITOR" "BPARAMETERCOLOR" "BPARAMETERFONT" "BPARAMETERSIZE" "BTMARKDISPLAY" "BVMODE" "CALCINPUT" "CAMERADISPLAY" "CAMERAHEIGHT" "CDATE" "CECOLOR" "CELTSCALE" "CELTYPE" "CELWEIGHT" "CENTERMT" "CHAMFERA" "CHAMFERB" "CHAMFERC" "CHAMFERD" "CHAMMODE" "CIRCLERAD" "CLAYER" "CLEANSCREENSTATE" "CLISTATE" "CMATERIAL" "CMDACTIVE" "CMDDIA" "CMDECHO" "CMDINPUTHISTORYMAX" "CMDNAMES" "CMLJUST" "CMLSCALE" "CMLSTYLE" "COMPASS" "COORDS" "CPLOTSTYLE" "CPROFILE" "CROSSINGAREACOLOR" "CSHADOW" "CTAB" "CTABLESTYLE" "CURSORSIZE" "CVPORT" "DASHBOARDSTATE" "DATE" "DBCSTATE" "DBLCLKEDIT" "DBMOD" "DCTCUST" "DCTMAIN" "DEFAULTLIGHTING" "DEFAULTLIGHTINGTYPE" "DEFLPLSTYLE" "DEFPLSTYLE" "DELOBJ" "DEMANDLOAD" "DIASTAT" "DIMADEC" "DIMALT" "DIMALTD" "DIMALTF" "DIMALTRND" "DIMALTTD" "DIMALTTZ" "DIMALTU" "DIMALTZ" "DIMAPOST" "DIMARCSYM" "DIMASO" "DIMASSOC" "DIMASZ" "DIMATFIT" "DIMAUNIT" "DIMAZIN" "DIMBLK" "DIMBLK1" "DIMBLK2" "DIMCEN" "DIMCLRD" "DIMCLRE" "DIMCLRT" "DIMDEC" "DIMDLE" "DIMDLI" "DIMDSEP" "DIMEXE" "DIMEXO" "DIMFIT" "DIMFRAC" "DIMFXL" "DIMFXLON" "DIMGAP" "DIMJOGANG" "DIMJUST" "DIMLDRBLK" "DIMLFAC" "DIMLIM" "DIMLTYPE" "DIMLTEX1" "DIMLTEX2" "DIMLUNIT" "DIMLWD" "DIMLWE" "DIMPOST" "DIMRND" "DIMSAH" "DIMSCALE" "DIMSD1" "DIMSD2" "DIMSE1" "DIMSE2" "DIMSHO" "DIMSOXD" "DIMSTYLE" "DIMTAD" "DIMTDEC" "DIMTFAC" "DIMTFILL" "DIMTFILLCLR" "DIMTIH" "DIMTIX" "DIMTM" "DIMTMOVE" "DIMTOFL" "DIMTOH" "DIMTOL" "DIMTOLJ" "DIMTP" "DIMTSZ" "DIMTVP" "DIMTXSTY" "DIMTXT" "DIMTZIN" "DIMUNIT" "DIMUPT" "DIMZIN" "DISPSILH" "DISTANCE" "DONUTID" "DONUTOD" "DRAGMODE" "DRAGP1" "DRAGP2" "DRAGVS" "DRAWORDERCTL" "DRSTATE" "DTEXTED" "DWFFRAME" "DWFOSNAP" "DWGCHECK" "DWGCODEPAGE" "DWGNAME" "DWGPREFIX" "DWGTITLED" "DYNDIGRIP" "DYNDIVIS" "DYNMODE" "DYNPICOORDS" "DYNPIFORMAT" "DYNPIVIS" "DYNPROMPT" "DYNTOOLTIPS" "EDGEMODE" "ELEVATION" "ENTERPRISEMENU" "ERRNO" "ERSTATE" "EXPERT" "EXPLMODE" "EXTMAX" "EXTMIN" "EXTNAMES" "FACETRATIO" "FACETRES" "FIELDDISPLAY" "FIELDEVAL" "FILEDIA" "FILLETRAD" "FILLMODE" "FONTALT" "FONTMAP" "FRONTZ" "FULLOPEN" "FULLPLOTPATH" "GRIDDISPLAY" "GRIDMAJOR" "GRIDMODE" "GRIDUNIT" "GRIPBLOCK" "GRIPCOLOR" "GRIPDYNCOLOR" "GRIPHOT" "GRIPHOVER" "GRIPOBJLIMIT" "GRIPS" "GRIPSIZE" "GRIPTIPS" "GTAUTO" "GTDEFAULT" "GTLOCATION" "HALOGAP" "HANDLES" "HIDEPRECISION" "HIDETEXT" "HIGHLIGHT" "HPANG" "HPASSOC" "HPBOUND" "HPDOUBLE" "HPDRAWORDER" "HPGAPTOL" "HPINHERIT" "HPNAME" "HPOBJWARNING" "HPORIGIN" "HPORIGINMODE" "HPSCALE" "HPSEPARATE" "HPSPACE" "HYPERLINKBASE" "IMAGEHLT" "IMPLIEDFACE" "INDEXCTL" "INETLOCATION" "INPUTHISTORYMODE" "INSBASE" "INSNAME" "INSUNITS" "INSUNITSDEFSOURCE" "INSUNITSDEFTARGET" "INTELLIGENTUPDATE" "INTERFERECOLOR" "INTERFEREOBJVS" "INTERFEREVPVS" "INTERSECTIONCOLOR" "INTERSECTIONDISPLAY" "ISAVEBAK" "ISAVEPERCENT" "LASTANGLE" "LASTPOINT" "LASTPROMPT" "LATITUDE" "LAYERFILTERALERT" "LAYOUTREGENCTL" "LEGACYCTRLPICK" "LENSLENGTH" "LIGHTGLYPHDISPLAY" "LIGHTLISTSTATE" "LIMCHECK" "LIMMAX" "LIMMIN" "LISPINIT" "LOCALE" "LOCALROOTPREFIX" "LOCKUI" "LOFTANG1" "LOFTANG2" "LOFTMAG1" "LOFTMAG2" "LOFTNORMALS" "LOFTPARAM" "LOGFILEMODE" "LOGFILENAME" "LOGFILEPATH" "LOGINNAME" "LONGITUDE" "LTSCALE" "LUNITS" "LUPREC" "LWDEFAULT" "LWDISPLAY" "LWUNITS" "ISOLINES" "MATSTATE" "MAXACTVP" "MAXSORT" "MBUTTONPAN" "MEASUREINIT" "MEASUREMENT" "MENUCTL" "MENUECHO" "MENUNAME" "MIRRTEXT" "MODEMACRO" "MSMSTATE" "MSOLESCALE" "MTEXTED" "MTEXTFIXED" "MTJIGSTRING" "MYDOCUMENTSPREFIX" "NOMUTT" "NORTHDIRECTION" "OBSCUREDCOLOR" "OBSCUREDLTYPE" "OFFSETDIST" "OFFSETGAPTYPE" "OLEFRAME" "OLEHIDE" "OLEQUALITY" "OLESTARTUP" "OPMSTATE" "ORTHOMODE" "OSMODE" "OSNAPCOORD" "OSNAPHATCH" "OSNAPZ" "OSOPTIONS" "PALETTEOPAQUE" "PAPERUPDATE" "PDMODE" "PDSIZE" "PEDITACCEPT" "PELLIPSE" "PERIMETER" "PERSPECTIVE" "PFACEVMAX" "PICKADD" "PICKAUTO" "PICKBOX" "PICKDRAG" "PICKFIRST" "PICKSTYLE" "PLATFORM" "PLINEGEN" "PLINETYPE" "PLINEWID" "PLOTOFFSET" "PLOTROTMODE" "PLQUIET" "POLARADDANG" "POLARANG" "POLARDIST" "POLARMODE" "POLYSIDES" "POPUPS" "PREVIEWEFFECT" "PREVIEWFILTER" "PRODUCT" "PROGRAM" "PROJECTNAME" "PROJMODE" "PROXYGRAPHICS" "PROXYNOTICE" "PROXYSHOW" "PROXYWEBSEARCH" "PSLTSCALE" "PSOLHEIGHT" "PSOLWIDTH" "PSTYLEMODE" "PSTYLEPOLICY" "PSVPSCALE" "PUBLISHALLSHEETS" "PUCSBASE" "QCSTATE" "QTEXTMODE" "RASTERDPI" "RASTERPREVIEW" "RECOVERYMODE" "REFEDITNAME" "REGENMODE" "RE-INIT" "REMEMBERFOLDERS" "RENDERPREFSSTATE" "REPORTERROR" "ROAMABLEROOTPREFIX" "RTDISPLAY" "SAVEFILE" "SAVEFILEPATH" "SAVENAME" "SAVETIME" "SCREENBOXES" "SCREENMODE" "SCREENSIZE" "SDI" "SELECTIONAREA" "SELECTIONAREAOPACITY" "SELECTIONPREVIEW" "SHADEDGE" "SHADEDIF" "SHADOWPLANELOCATION" "SHORTCUTMENU" "SHOWHIST" "SHOWLAYERUSAGE" "SHPNAME" "SIGWARN" "SKETCHINC" "SKPOLY" "SNAPANG" "SNAPBASE" "SNAPISOPAIR" "SNAPMODE" "SNAPSTYL" "SNAPTYPE" "SNAPUNIT" "SOLIDCHECK" "SOLIDHIST" "SPLFRAME" "SPLINESEGS" "SPLINETYPE" "SSFOUND" "SSLOCATE" "SSMAUTOOPEN" "SSMPOLLTIME" "SSMSHEETSTATUS" "SSMSTATE" "STANDARDSVIOLATION" "STARTUP" "STEPSIZE" "STEPSPERSEC" "SUNPROPERTIESSTATE" "SUNSTATUS" "SURFTAB1" "SURFTAB2" "SURFU" "SURFTYPE" "SURFV" "SYSCODEPAGE" "TABLEINDICATOR" "TABMODE" "TARGET" "TBCUSTOMIZE" "TDCREATE" "TDINDWG" "TDUCREATE" "TDUPDATE" "TDUSRTIMER" "TDUUPDATE" "TEMPOVERRIDES" "TEMPPREFIX" "TEXTEVAL" "TEXTFILL" "TEXTQLTY" "TEXTSIZE" "TEXTSTYLE" "THICKNESS" "TILEMODE" "TIMEZONE" "TOOLTIPMERGE" "TOOLTIPS" "TPSTATE" "TRACEWID" "TRACKPATH" "TRAYICONS" "TRAYNOTIFY" "TRAYTIMEOUT" "TREEDEPTH" "TREEMAX" "TRIMMODE" "TSPACEFAC" "TSPACETYPE" "TSTACKALIGN" "TSTACKSIZE" "UCSAXISANG" "UCSBASE" "UCSDETECT" "UCSFOLLOW" "UCSICON" "UCSNAME" "UCSORG" "UCSORTHO" "UCSVIEW" "UCSVP" "UCSXDIR" "UCSYDIR" "UNDOCTL" "UNDOMARKS" "UNITMODE" "UPDATETHUMBNAIL" "USERI1-5" "USERR1-5" "USERS1-5" "VIEWCTR" "VIEWDIR" "VIEWMODE" "VIEWSIZE" "VIEWTWIST" "VISRETAIN" "VPMAXIMIZEDSTATE" "VSBACKGROUNDS" "VSEDGECOLOR" "VSEDGEJITTER" "VSEDGEOVERHANG" "VSEDGES" "VSEDGESMOOTH" "VSFACECOLORMODE" "VSFACEHIGHLIGHT" "VSFACEOPACITY" "VSFACESTYLE" "VSHALOGAP" "VSHIDEPRECISION" "VSINTERSECTIONCOLOR" "VSINTERSECTIONEDGES" "VSINTERSECTIONLTYPE" "VSISOONTOP" "VSLIGHTINGQUALITY" "VSMATERIALMODE" "VSMAX" "VSMIN" "VSMONOCOLOR" "VSOBSCUREDCOLOR" "VSOBSCUREDEDGES" "VSOBSCUREDLTYPE" "VSSHADOWS" "VSSILHEDGES" "VSSILHWIDTH" "VSSTATE" "VTDURATION" "VTENABLE" "VTFPS" "WHIPARC" "WHIPTHREAD" "WINDOWAREACOLOR" "WMFBKGND" "WMFFOREGND" "WORLDUCS" "WORLDVIEW" "WRITESTAT" "WSCURRENT" "XCLIPFRAME" "XEDIT" "XFADECTL" "XLOADCTL" "XLOADPATH" "XREFCTL" "XREFNOTIFY" "XREFTYPE" "ZOOMFACTOR" "ZOOMWHEEL"))
Mình lưu ý luôn 1 vài nhược điểm của lisp này:
- Do danh sách biến hệ thống được thống kê thủ công, nên có thể sót 1 vài biến không được kiểm tra. Đồng thời 1 vài biến chúng ta không quan tâm vì nó luôn thay đổi tại mỗi thời điểm cũng không được đưa vào so sánh.
- Danh sách này bác DVH lấy dựa vào danh sách các biến hệ thống của cad 2007, nó chạy tốt với các bản cad 2007-2010. từ bản 2011 trở lên autodesk đã có 1 số thay đổi lớn về giao diện và cách thức autocad tương tác với người dùng nên một số biến hệ thống liên quan có thể không còn tồn tại ở các bản cad này. bạn cần remove nó khỏi danh sách trong lisp để tránh lỗi có thể sảy ra. tương tự với các bản cad đời thấp. sẽ không có 1 số biến của cad 2007 cũng cần fải remove đi mới chạy được.
- code mình viết sơ bộ, chủ yếu để triển khai ý tưởng nên chỉ thông báo kết quả ra cửa sổ command của cad. tốt nhất các bạn nên sửa lại để thống kê ra file text giúp kiểm tra sự khác nhau được dễ dàng hơn.
-
2
-
-
Vì sao lại không thể áp dụng với Dynamic Block có ATTributes được ạ? phương pháp này rõ ràng không có bất kỳ nguyên nhân nào khiến ATTributes trở thành 1 đối tượng cá biệt.
Đây là 1 lisp em lấy từ thư viện của em ra. có ATT và Động, tạo bằng phương pháp trên. nếu test lisp này, bác dùng thêm hàm con string-right-trim em post bên trên
(ai trả lời cho tui biết cái nút upload của diễn đàn chạy đâu mất rồi :( )
-
1
-
-
Chính xác là mã 70 chứ không fải mã 90
để biết chính xác tính chất của đối tượng thì bạn cần fải làm 2 bước
- bước 1: hãy thống kê các đối tượng khả dĩ có tính chất này: spline, polyline, arc...
- bước 2: kiểm tra đối tượng có thuộc nhóm trên không. nếu có thì kiểm tra mã dxf 70 của nó
-
@Detailing. đây là block mẫu và file lisp mình đã tạo được, chạy ngon lành. file này minh lưu ở định dạng dxf 2010. cad mình đang dùng là 2010.
Mục đích chính đúng như ketxu nói. nó tăng tính cơ động cho ứng dụng vì người dùng không fải lo thiết lập suport path hoặc bị bắt buộc fải cài đặt chương trình vào 1 thu mục cố định.
Hãy thử tưởng tượng, bạn chỉ cần copy 1 file ứng dụng duy nhất của mình vào USB và mang nó đi bất cứ máy nào, chỉ việc cắm, load và chạy là bạn có thể thiết lập được môi trường làm việc quen thuộc của mình. không fải lo việc fải thiết lập các điều kiện để ứng dụng của bạn có thể chạy được và cũng không gây ra bất cứ thay đổi nào đến thiết lập của máy người khác sau khi rút usb ra.
-
1
-
-
- @Detailing xem lại file dxf nhé. nó là 1 block thường mất rồi. nguyên nhân là bạn đã block cái block động của bạn 1 lần nữa (block động trong block). khi tạo xong block động bạn đừng đóng block editor vội. hãy nhấn nút save block as để lưu nó ra file dxf sẽ được 1 file block. file này nhẹ hơn 1 file bản vẽ (nếu đóng block editor rồi mới lưu thì nó là 1 file bản vẽ thông thường) bởi nó tự động loại bỏ các thông tin khác của bản vẽ không liên quan đến dữ liệu cấu thành file block đó.
- @Skywings: đúng là hiện tại toàn bộ thư viện block, linestyle, textstyle, dimstyle của mình đều được gói gọn trong code. chỉ duy nhất 1 file fas nên thoải mái cơ động.
- @Ketxu giải thích về vl-get-resource luôn đi. mình chưa dùng hàm này bao giờ
-
Chết thật. Mình chưa gỡ project khỏi cad khi test lisp. Nó là hàm con của mình. đã bổ sung rồi nhé :D
-
1
-
-
-
Topic này được lập theo nhu cầu của bạn Skywings - cần tạo code để tích hợp luôn các block cần dùng vào trong code của chương trình của bạn ấy, trong đó có cả dynamic block hay còn gọi là block động. Mình lập topic trả lời cho skywings cũng đồng thời để chia sẻ phương pháp cho bác nào có nhu cầu và để chúng ta thảo luận,
Bác nào có phương pháp hay hơn muốn chia sẻ thì thảo luận tại đây tránh làm loãng topic giới thiệu chương trình của Skywings.
Cho đến thời điểm này có thể nói 1 chắc chắn rằng chúng ta không có phương pháp để tạo block động bằng lisp, hay kể cả là vba. Các diễn đàn nước ngoài thấy tụi nó kêu bó tay, trong help developer cũng nói rõ điều này, các ngôn ngữ khác thì mình không rõ. Vậy mình tạo nó bằng cách nào? thực tế nó rất đơn giản nếu chúng ta nghĩ khác cách làm thông thường 1 chút.
Ở đây mình lợi dụng khả năng đọc, ghi và lưu 1 tập tin bất kì ở định dạng không mã hóa của lisp. Và may mắn là Autocad cung cấp cho chúng ta khả năng đọc và ghi 1 file bản vẽ ra 2 loại định dạng:
- DWG: Định dạng mã hóa mà mặc định chúng ta hay dùng.
- DXF: Định dạng mở, không mã hóa, có thể đọc được cấu trúc của nó bằng bất kỳ công cụ đọc văn bản nào. Định dạng này do chưa được biên dịch nên tải vào cad chậm hơn dwg, đồng thời dung lượng file thường cao hơn.
Thay vì cố gắng tìm cách make 1 dynamic block ngay trong bản vẽ thì mình sẽ make 1 file dxf chứa dynamic block đó rồi sau đó tải nó vào bản vẽ.
Ý tưởng là vậy. mình cụ thể hóa nó bằng các bước như sau:
- Tạo 1 dynamic block bằng cad theo ý muốn cho chương trình của bạn và lưu nó lại với định dạng dxf. Vì cad có khả năng tương thích ngược với các bản cad đời trước khá tốt nên lời khuyên là chọn định dạng dxf của phiên bản 2007 để lưu. Nó nhẹ hơn mấy thằng ku em nó sau này. dxf của cad2007 được chọn cũng là vì đây là bản cad đầu tiên hỗ trợ dynamic block.
- Dùng lisp mình viết dưới đây để đọc nội dung file dxf trên và tạo ra code để make.
- kết quả thu được là 1 file lisp, nội dung của nó là 1 hàm con có thể make được block của bạn.
;;; Make Dynamic block by Lisp ;;; Copyright 2012 Thaistreetz - Cadviet.com (defun c:mkb (/ lst openfile path) (setq path (getfiled "Chon File block" "" "dxf" 8)) (setq openfile (open path "r")) (while (setq readline (read-line openfile)) (setq lst (cons (strcat "\"" (acet-str-replace "\"" "\\\"" readline )"\"") lst))) (close openfile) (setq path (getfiled "Nhap ten File lisp" "" "lsp" 1)) (setq openfile (open path "w")) (write-line "(defun insert-block (point scale / temp file lst)" openfile) (write-line "(setq lst (list" openfile) (foreach ll (reverse lst) (write-line ll openfile)) (write-line "))" openfile) (write-line "(setq temp (strcat (string-right-trim 8 (findfile \"acad.dcl\")) \"temp.dxf\")" openfile) (write-line " file (open temp \"W\"))" openfile) (write-line " (foreach ll lst (write-line ll file))" openfile) (write-line " (close file)" openfile) (write-line " (command \"-insert\" temp point scale 0)" openfile) (write-line " (vl-file-delete temp))" openfile) (close openfile)) (defun String-right-trim (trim string /) (cond ((= (type trim) 'STR) (vl-string-right-trim trim string)) ((= (type trim) 'INT) (substr string 1 (- (strlen string) trim))) (t string)))
PS:
- Ngoài Dynamic block, bằng phương pháp này bạn có thể tạo được các đối tương khác của cad mà chúng ta chưa có phương pháp tạo theo cách thông thường. Ví dụ các linetype có chứa true type font, hay các bảng đối tượng...
- Có thể bạn sẽ hoảng nếu đọc cấu trúc của hàm con được tạo, vì nó...dài lê thêê...ê...ê. Kệ nó, cái này bạn có thể yên tâm vì lisp xử lý chuỗi (string) rất nhanh. Con máy cùi bắp của mình xử lý 1 file dưới 1Mb đủ nhanh để không cảm thấy khó chịu vì độ trễ trong khi file tạo ra chỉ khoảng vài chục Kb đến vài trăm Kb là cùng.
- Lisp trên mình sử dụng command để insert block, nếu có thể hãy thay thế bằng các hàm vla để tránh lỗi có thể sảy ra khi insert block
-
10
-
-
OK! Vậy là chưa có bất kỳ phương pháp nào để tạo được Dynamic block. Trước đây cũng đã có cao thủ khẳng định rằng có thể tạo được Dynamic block bằng command thuần túy, nhưng kết quả cho thấy rằng cao thủ này chém gió. Vì đây là vấn chưa từng được giải quyết và chắc là sẽ có 1 số người quan tâm nên mình sẽ tạo riêng 1 topic để bàn về vấn đề này. Mai nhé!
-
Lạy hồn! bạn nghĩ là người ta vẫn đang chờ 1 câu trả lời của bạn sau 2 năm hả? =]]
-
Có 1 chút góp ý nho nhỏ:
Ứng dụng này thiếu 1 chút mềm dẻo khi bắt buộc người dùng phải đặt các file của nó vào 1 thư mục cố định D:\HiTD. Mình xem qua các file đi kèm ứng dụng này thì yêu cầu trên chủ yếu là để chương trình có thể tự động tải 1 số block vào bản vẽ từ file HiTD-lib.dwg. Nếu không đặt đúng như yêu cầu chương trình sẽ lỗi khi chạy lần đầu.
Bạn hoàn toàn có thể khắc phục việc này bằng cách make luôn các bock cần dùng ngay trong code của chương trình. Làm việc này không khó, bạn hãy google từ khóa: "MakeEntmake" sẽ ra thứ giúp bạn dễ dàng làm việc này.
Trong số các block của chương trình mình cũng thấy có 1 dynamic block, nếu bạn không make được block này theo cách trên thì có thể reply topic này, mình sẽ post code để make nó cho bạn.
các file help.txt và HiTD info.txt thì quá đơn giản để tích hợp luôn vào code rồi. Như thế ứng dụng của bạn sẽ được thu gọn về 1 file duy nhất và người dùng có thể thoải mái quăng ứng dụng của bạn bất kì đâu mà họ muốn.
-
1
-
-
Có lẽ do là dân ngoại đạo với vấn đề thoát nước (mình chủ yếu làm giao thông, chỉ thỉnh thoảng mới động tay vào thoát nước) nên mình thấy ứng dụng của Skywings không còn gì để mà chê nữa cả. Từ cách thức triển khai thiết kế, bố trí giao diện người dùng, các lựa chọn cho kết quả đến cả cách trình bày bản vẽ đều rất đầy đủ, chi tiết và chỉn chu. rất tuyệt vời! Mình đặc biệt thích cách trình bày bản vẽ của bạn. Cảm ơn bạn đã chia sẻ ứng dụng này.
-
1
-
-
VBA hiện giờ không còn được hỗ trợ chính thức cho cad nữa bạn ạ. Bạn buộc phải tải thêm gói cài đặt VBA cho các bản cad từ 2010 trở đi. tương lai thì chưa biết thế nào, nhưng có vẻ động thái này là 1 phần trong kế hoạch dần dần loại bỏ VBA ra khỏi cad.
-
Trong thư viện MSDN có bác ạ ^^ Hi vọng e sớm được dùng thử sản phẩm của bác :D
Ok man! :D
-
Tuyệt vời Kétxù ạ. Đúng như dự đoán, nó chạy ngon trong hàm callback rồi, cảm ơn bạn rất nhiều :D
Thêm tý nhé. Mình có thể tham khảo cấu trúc của "Keys" ở đâu? hàm sendkeys này lợi hại quá!
-
Cấu trúc hàm trên lạ quá. mình chưa dùng kiểu này bao giờ. nhìn vào chuỗi trong điều kiện hàm cond thì mình đoán là nó fát lệnh alt+F4 (cái này là lệnh của window áp dụng cho mọi application chạy trong môi trường của nó thì fải) nếu trường hợp bản vẽ có thay đổi thông tin so với lúc mới mở thì mặc định cad sẽ hỏi có lưu bản vẽ hay không và ta thêm lựa chọn Yes. Đúng không ketxu?
Tuy nhiên nó không chạy được với máy của mình. sau khi gõ lệnh test thì nó dừng lại, in ra giá trị -1 ở command và con trỏ ở trạng thái chờ nhập dữ liệu.
Dùng sendcommand thì không được với trường hợp của mình. bởi nó bản chất vẫn là command-đội lốt lisp.
Mình đang viết 1 ứng dụng quản lý bản vẽ. trong đó có 1 số thao tác mở và đóng bản vẽ thực hiện trong các hàm callback, được gọi bởi các reactor liên kết với 1 số sự kiện trong chương trình. Chết dở ở chỗ hàm Callback của reactor không cho phép sử dụng command dưới bất kỳ hình thức nào, chỉ được phép sử dụng ActiveX.
Nhìn vào cách thức thực hiện đóng bản vẽ trong hàm sendkeys của bạn thì có lẽ nó sẽ áp dụng được cho trường hợp của mình. nhưng chưa biết vì sao nó không hoạt động tốt với máy của mình thôi. WinXP SP3, Cad2010 và 2013, không cài đặt gói VBA
-
Câu hỏi của mình rất rõ ràng mà bác Hà.
- Code trên đóng tất cả bản vẽ Không phải hiện hành bằng lisp.
- và đóng bản vẽ hiện hành bằng command
-
Làm thế nào để đóng bản vẽ hiện hành bằng lisp (không dùng command hay vb) các bác nhẩy?
-
Bạn tắt wipeout đi: gõ lệnh wipeout -> frames -> off
hoặc muốn nhanh hơn thì dùng lisp mình post ở đây
-
Lệnh Textmask của express tool "hơi bị ngu". Nó sẽ xử đẹp đối tượng text nếu text của bạn là Annotative text. (Hoặc có thể mình ngu vì kiếm hoài không ra chỗ để thiết lập cho nó chạy suôn sẻ với Annotative text.)
Thế nên mình viết lại lệnh này để có thể dùng với cả text thường lẫn Annotative text. khỏi sợ vô tình text bay đâu mất.
;;; Textmask for Annotative Text - Copyright 2012 Thaistreetz - Cadviet.com (defun c:TMK (/ DXF MakeWipeout ss->list MakeGroup ss pt1 dk oset wipeout) (defun DXF (code en) (cdr (assoc code (entget en)))) (defun MakeWipeout (listpoint Layer Color xdata / dxf10 max_dist cen dxf14) (if (and (< (atof (getvar "acadver")) 19) (not (member "acwipeout.arx" (arx)))) (arxload "acwipeout.arx")) (setq dxf10 (list(apply'min(mapcar'car listpoint))(apply'min(mapcar'cadr listpoint))(if(caddar listpoint)(caddar listpoint)0)) max_dist(float(apply'max(mapcar'-(apply'mapcar(cons'max listpoint))dxf10))) cen (mapcar'+ dxf10(list(/ max_dist 2)(/ max_dist 2) 0.0)) dxf14 (mapcar'(lambda(p)(mapcar'/(mapcar'- p cen)(list max_dist(- max_dist)1.0)))listpoint) dxf14 (reverse(cons(car dxf14)(reverse dxf14)))) (entmakex (append (list '(0 . "WIPEOUT")'(100 . "AcDbEntity") (cons 8 (if Layer Layer (getvar "Clayer"))) (cons 62 (if Color Color 256)) '(100 . "AcDbWipeout")'(90 . 0) (cons 10 (trans dxf10 (list 0 0 1) 0)) (cons 11 (trans (list max_dist 0.0 0.0) (list 0 0 1) 0)) (cons 12 (trans (list 0.0 max_dist 0.0) (list 0 0 1) 0)) '(13 1.0 1.0 0.0)'(70 . 7)'(280 . 1)'(71 . 2) (cons 91 (length dxf14))) (mapcar'(lambda(p)(cons 14 p))dxf14) (list (cons -3 (if xdata (list xdata) nil)))))) (defun ss->list (ss / i lst) (if ss (repeat (setq i (sslength ss)) (setq lst (cons (ssname ss (setq i (1- i))) lst))))) (defun MakeGroup (lstEname Description / dict ind) (setq dict (dictsearch (namedobjdict) "ACAD_GROUP") ind "GRP1") (while (member (cons 3 ind) dict) (setq ind (strcat "GRP" (itoa (1+ (atoi (substr ind 4))))))) (dictadd (cdr (assoc -1 dict)) ind (entmakex (append (list '(0 . "GROUP")'(100 . "AcDbGroup")(cons 300 Description)'(70 . 0)'(71 . 1))(mapcar'(lambda(x)(cons 340 x))lstEname)))));end (command "undo" "begin") (prompt (Strcat "<< he so [O]ffset hien hanh = " (rtos (setq OSET (if (acet-getvar '("acet_textmask_offset")) (acet-getvar '("acet_textmask_offset")) 0.25)) 2 4) " >>\nChon text: ")) (setq dk (grread nil 14 2)) (while DK (if (= (car DK) 3) (setq PT1 (cadr DK) ss (ss->list (ssget "C" PT1 (getcorner PT1) '((0 . "TEXT")))) dk nil) (if (or (equal DK '(2 111)) (equal DK '(2 79))) (progn (prompt "[Offset]") (grread nil 14 2) (setq oset (getreal " - nhap he so: ")) (acet-setvar (list "acet_textmask_offset" oset 3)) (setq dk (grread nil 14 2))) (setq dk (grread nil 14 2))))) (foreach ss ss (setq wipeout (MakeWipeout (mapcar'(lambda (x) (trans x 1 0)) (acet-geom-textbox(entget ss) oset)) (dxf 8 ss) nil nil)) (command "DRAWORDER" ss "" "f") (MakeGroup (list wipeout ss) (DXF 1 ss))) (command "undo" "end")(princ))
Lưu ý:
- Lệnh này viết mục đích thay thế lệnh textmask, nhưng không có nghĩa là bạn không cần cài đặt express tool. Do lisp sử dụng chung hệ số offset với lệnh textmask và một số hàm của express tool nên bạn bắt buộc fải cài mới dùng được.
- Để điều chỉnh hệ số offset, nhấn fím O trước khi chọn đối tượng.
- Lisp này tạo ra đối tượng y hệt lệnh TextMask nên có thể dùng lệnh TextUnMask để đưa đối tượng về trạng thái cũ bình thường.
-
2
-
-
ủa! ae72010 là clone của linhoreka à? post chương trình và sửa chương trình là 2 nick khác nhau
Link xịt rồi thật (!?)
-
Trong các bản cad2013+ thì wipeout đã được tích hợp vào cad như 1 đối tượng chính thức của cad chứ không fải được tải vào thông qua 1 arx ngoài nữa. đối tượng wipeout cũng được thêm 1 trạng thái chỉ hiện chứ không in ra: "Display but not plot" so với các bản cad trước chỉ có 2 trạng thái On và Off
Việc điều khiển trạng thái của đối tương wipeout từ fiên bản này được chuyển cho 1 biến hệ thống là WIPEOUTFRAME chứ không dùng từ điển đối tượng nữa. các giá trị tương ứng:
- Off <0>
- On <1>
- Display but not plot <2>
Lisp trên được viết lại để tương thích cho cả các bản cad 2013+ như sau:
(defun c:wr (/ en) (if (< (atof (getvar "acadver")) 19) (if (not (setq en (dictsearch (namedobjdict) "ACAD_WIPEOUT_VARS"))) (prompt "<< Khong co doi tuong wipeout nao trong ban ve>>") (progn (if (= (cdr (assoc 70 en)) 0) (progn (entmod-en 70 1 (cdr (assoc -1 en))) (prompt ": << Bat Wipeout >>")) (progn (entmod-en 70 0 (cdr (assoc -1 en))) (prompt ": << Tat Wipeout >>"))) (foreach en (ss->list (ssget "x" '((0 . "WIPEOUT,INSERT")))) (entupd en)))) (if (= (getvar "wipeoutframe") 0) (progn (setvar "wipeoutframe" 1) (prompt ": << Bat Wipeout >>")) (progn (setvar "wipeoutframe" 0) (prompt ": << Tat Wipeout >>")))) (princ))
-
2
-
-
hà hà. đặt gạch hóng các bài tiếp theo của Detailing!
Detailing cho mình hỏi chút. Vì sao bạn lại học cùng lúc 2 ngôn ngữ này: ObjectArx và AutoCAD.NET. Phải chăng mỗi ngôn ngữ này có những điểm yếu không thể thỏa mãn lập trình viên nên bắt buộc lập trình viên phải kết hợp 2 ngôn ngữ này cho chương trình của mình.
[Đã xong] - Lisp so sánh sự khác nhau giữa các biến hệ thống của 2 bản vẽ
trong AutoLisp
Đã đăng · Trả lời báo cáo
1) Vì mình cứ thế bê nguyên code của bác về, đọc qua loa rồi sửa nên không để ý mục đích hàm điều kiên trên. Đúng là chỗ này chỗ này mình nhận xét hồ đồ đúng là thật.
2) Không hiểu sao máy của mình nó không chạy được lệnh Acadinfo. Giữa chừng thì tịt
Ku Ketxu này hay có cách làm ko giống ai. Giải thích đê!