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

Nhờ các bác sửa lisp chuyển text qua lại giữa FULL-WIDTH <--> HALF-WIDTH

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

Chào các bác!

Đây là lần đầu em lên diễn đàn nên có gì thiếu sót mong các bác bỏ qua.

Em đang làm cho công ty nhật bản và có sử dụng phần mềm IJCAD tương tự với AUTOCAD. Công việc em đang làm sẽ có lúc cần chuyển text FULL-WIDTH <--> HALF-WIDTH như : 1 thành 1, a thành a, B thành B...
Lúc trước khi còn xài autocad thì em có xài code chuyển đổi kí tự của bác Phạm Quốc Duy, chỉ cần thay list từ điển tự nhập giữa 2 kiểu là được, nhưng khi qua ijcad dường như phần mềm không hiểu kí tự full-width mình đưa vào lisp, nên em có chỉnh sửa lại thay vì nhập thẳng full-width thì thay bằng unicode của kí tự full-width,  nhưng bị vấn đề là ijcad sẽ chuyển luôn kí tự có trong mã unicode trong thư viện. 

(setq listnguonchuyenm (list "0" "1"))
(setq listdichchuyenm (list "\U+FF10" "\U+FF11"))

ví dụ chuyển số 01 thành 01 thì sẽ chuyển luôn kí tự 01 trong \U+FF10,  \U+FF11. nên kết quả hiển thị ra sẽ là  \U+FF101. 

Mong các bác giúp em với.

Cảm ơn các bác nhiều.

full code 

 

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:s_chuoi>thay (ndnhap ndsua ndthay / ndnhap ndsua ndthay skt sktd ndnhan ktd)
(setq skt (strlen ndnhap))
(setq sktd (strlen ndsua))
(setq stt 1)
(setq ndnhan "")
(while 
(< stt (+ skt 1))
(cond 
((=  (substr ndnhap stt sktd) ndsua) (setq ktd ndthay) (setq stt (+ stt sktd))) 
((/=  (substr ndnhap stt sktd) ndsua) (setq ktd (substr ndnhap stt 1)) (setq stt (+ stt 1))) 
)
(setq ndnhan (strcat ndnhan ktd))
)
ndnhan)


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;Thay noi dung chuoi bang list nguon va list dich
;;;Cu phap su dung (duy:s_chuoi>thay chuoigoc noidungcanthay thaythanhnoidung)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun duy:chuyenma (chuoi lstgoc lstthay / chuoi listgoc listthay goc thay)
(mapcar '(lambda(goc thay)(setq chuoi (duy:s_chuoi>thay chuoi goc thay))) lstGoc lstThay)
chuoi)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(Defun c:DN (/ b i N DTMs kqthay)
(command "undo" "be")
(setq listnguonchuyenm (list "0" "1"))
(setq listdichchuyenm (list "\U+FF10" "\U+FF11"))
(setq b (ssget (list (cons 0 "*TEXT,DIMENSION"))))
(setq SUMb 0)
(setq i 0)
(setq N (sslength b))
(while (< i N)
(setq kqthay (duy:chuyenma (cdr (assoc 1 (entget (ssname b i))))  listnguonchuyenm listdichchuyenm)) 
(setq DTMs (subst (cons 1 kqthay) (assoc 1 (entget (ssname b i))) (entget (ssname b i))))
(entmod DTMs)

(setq i (1+ i))
)
(command "undo" "end")
(Princ)) 


 

 

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

Mình không rõ IJcad, nhưng bạn có thể thử cái này:

(defun c:test ( / halfwid ss)
  (defun halfwid (ent0 / ENT LS1 NEWTEXT NOIDUNG) 
(setq  ent (entget ent0)    
      ls1 (VL-STRING->LIST (cdr (assoc 1 ent)))
      newtext ""  )
(foreach n ls1
  (setq newtext (strcat newtext (if (and (> n 47) (< n 58)) "\\U+FF1" "" ) (chr n)))                       
  );foreach
(setq ent (subst (cons 1 newtext) (assoc 1 ent) ent))
(entmod ent)
  )  ;halfwid
(setq ss (ACET-SS-TO-LIST (ssget )))
(foreach ent ss (halfwid ent))
  )

 

  • Like 1

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ạ e cám ơn, nhưng e vừa add code bác vào ijcad nhưng nó k chuyển được, phần mềm ijcad này đc chỉnh từ autocad nên cũng có phần khác, khả năng k tương thích với code của 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

Bạn thử lại cái này, nhớ chụp lại màn hình command line để xem lỗi ra sao

(defun c:test ( / halfwid ss LM:ss->ent)
  (defun LM:ss->ent ( ss / i l )
    (if ss
        (repeat (setq i (sslength ss))
            (setq l (cons (ssname ss (setq i (1- i))) l))
        )
    )
)
  (defun halfwid (ent0 / ENT LS1 NEWTEXT NOIDUNG) 
(setq  ent (entget ent0)    
      ls1 (VL-STRING->LIST (cdr (assoc 1 ent)))
      newtext ""  )
(foreach n ls1
  (setq newtext (strcat newtext (if (and (> n 47) (< n 58)) "\\U+FF1" "" ) (chr n)))                       
  );foreach
(setq ent (subst (cons 1 newtext) (assoc 1 ent) ent))
(entmod ent)
  )  ;halfwid
(setq ss (LM:ss->ent (ssget )))
(foreach ent ss (halfwid ent))
  )

 

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

Mục tiêu thì mới chuyển mỗi chữ số, do đó cách tiếp cận khác so với chuyển đổi chữ.

(DEFUN c:test  (/ halfwid ss LM:ss->ent Dec2Hex)
  (DEFUN LM:ss->ent  (ss / i l)
    (IF ss
      (REPEAT (SETQ i (SSLENGTH ss))
        (SETQ l (CONS (SSNAME ss (SETQ i (1- i))) l))
        )
      )
    )
  (DEFUN Dec2Hex  (num / val hex)
    (SETQ hex "")
    (WHILE (< 0 num)
      (SETQ val (REM num 16)
            hex (STRCAT (IF (< val 10)
                          (CHR (+ 48 val))
                          (CHR (+ 55 val))
                          )
                        hex
                        )
            num (/ num 16)
            )
      )
    hex
    )


  (DEFUN halfwid  (ent0 / ENT LS1 NEWTEXT NOIDUNG)
    (SETQ ent     (ENTGET ent0)
          ls1     (VL-STRING->LIST (CDR (ASSOC 1 ent)))
          newtext "")
    (FOREACH n  ls1
      (SETQ newtext (STRCAT newtext "\\U+" (dec2hex (+ 65248 n))))
      ) ;foreach
    (SETQ ent (SUBST (CONS 1 newtext) (ASSOC 1 ent) ent))
    (ENTMOD ent)
    ) ;halfwid
  
  (SETQ ss (LM:ss->ent (SSGET)))
  (FOREACH ent ss (halfwid ent))
  )

;|«Visual LISP© Format Options»
(180 2 1 0 nil "end of " 100 20 2 0 0 nil T nil T)
;*** DO NOT add text below the comment! ***|;

 

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

Số 0 có mã ascii là 48, bạn muốn đổi sang ký tự số 0 mã unicode là FF10 (HEX) = 65296 (decima). Như vậy bạn sẽ phải dịch chuyển 65248 đơn vị để sang mã mới

(SETQ newtext (STRCAT newtext "\\U+" (dec2hex (+ 65248 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

hiện tại đã chạy ổn half-width sang full-width, nhưng vẫn bị vấn đề nếu lỡ chạy lệnh lần nữa thì sẽ hiển thị ra mã unicode luôn
trường hợp dùng lisp này chuyển từ half-width sang full-width rồi lại từ full-width sang half-width thì phải sửa sao bác, mong bác giúp

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ào lúc 6/8/2024 tại 15:24, cuongtk2 đã nói:

Hic. Nếu em muốn viết = dll thì anh viết cho. Lisp giờ nhác viết quá.

IJCAD sử dụng file thư việc khác AutoCAD nhé.

tham chiếu 2 file gmap.dll và gmdb.dll tương tự GstarCAD.

 

Update: ver 2024 sử dụng các file: GcCoreMgd.dll, GcDbMgd.dll và GcMgd.dll

IJCAD_API.png.787c113d5ebd70e37322b85dcd5ed6d6.png

Chỉnh sửa theo gia_bach

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

Mình cũng biết IJCAD cần có 2  dll này, nhưng phải mua bản quyền phần mềm nó mới cho download nên thôi.

Nó có bộ cho DEV như ObjectArx không nhỉ?

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

đây là mã unicode các kí tự half-full. mong các anh giúp em ạ

*số
half: 0 1 2 3 4 5 6 7 8 9
unicode : \U+0030 \U+0031 \U+0032 \U+0033 \U+0034 \U+0035  \U+0036 \U+0037 \U+0038 \U+0039   
full: 0 1 2 3 4 5 6 7 8 9
unicode : \U+FF10 \U+FF11 \U+FF12 \U+FF13 \U+FF14 \U+FF115 \U+FF16 \U+FF17 \U+FF18 \U+FF19


*chữ thường
half : a b c d e f g h i j k l m n o p q r s t u v w x y z 
unicode : \U+0061 \U+0062 \U+0063 \U+0064 \U+0065 \U+0066 \U+0067 \U+0068 \U+0069 \U+006A \U+006B \U+006C \U+006D \U+006E \U+006F \U+0070 \U+0071 \U+0072 \U+0073 \U+0074 \U+0075 \U+0076 \U+0077 \U+0078 \U+0079 \U+007A
full: a b c d e f g h i j k l m n o p q r s t u v w x y z
unicode: \U+FF41 \U+FF42 \U+FF43 \U+FF44 \U+FF45 \U+FF46 \U+FF47 \U+FF48 \U+FF49 \U+FF4A \U+FF4B \U+FF4C \U+FF4D \U+FF4E \U+FF4F \U+FF50 \U+FF51 \U+FF52 \U+FF53 \U+FF54 \U+FF55 \U+FF56 \U+FF57 \U+FF58 \U+FF59 \U+FF5A

*chữ hoa
half: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 
unicode : \U+0041 \U+0042 \U+0043 \U+0044 \U+0045 \U+0046 \U+0047 \U+0048 \U+0049 \U+004A \U+004B \U+004C \U+004D \U+004E \U+006F \U+0050 \U+0051 \U+0052 \U+0053 \U+0054 \U+0055 \U+0056 \U+0057 \U+0058 \U+0059 \U+005A
full : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
unicode : \U+FF21 \U+FF22 \U+FF23 \U+FF24 \U+FF25 \U+FF26 \U+FF27 \U+FF28 \U+FF29 \U+002A \U+002B \U+002C \U+002D \U+002E \U+002F \U+FF30 \U+FF31 \U+FF32 \U+FF33 \U+FF34 \U+FF35 \U+FF36 \U+FF37 \U+FF38 \U+FF39 \U+FF3A

*kí hiệu 
half : ~     !     @    #    $    %    ^    &    *    (    )    [    ]    \    "    ,    .    <    >    +
unicode : U+007E    U+0021    U+0040    U+0023    U+0024    U+0025    U+005E    U+0026    U+002A    U+0028    U+0029    U+005B    U+005D    U+005C    U+0022    U+002C    U+002E    U+003C    U+003E    U+002B
full : ~    !    @    #    $    %    ^    &    *    (    )    「    」    ¥    ”    、    。    <    >    +
unicode: U+FF5E    U+FF01    U+FF20    U+FF03    U+FF04    U+FF05    U+FF3E    U+FF06    U+FF0A    U+FF08    U+FF09    U+300C    U+300D    U+FFE5    U+201D    U+3001    U+3002    U+FF1C    U+FF1E    U+FF0B


 

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  

×