本帖最后由 dcl1214 于 2026-2-5 11:05 编辑

  1. (defun $umi-ocr-http$ (ip         port         imgpath
  2.            lst         /         $16-to-10$
  3.            $file->base64$  $json-zhuan-lisp$
  4.            $str-duan-kai$  $str-ti-huan$
  5.            $str-zhuan-unicode$
  6.            $unicode10-zhuan-str$
  7.            $unicode-zhuan-huan$         b64
  8.            data         http         i
  9.            json         open-zt         resp
  10.            send-zt         str         url
  11.           )
  12.   (defun $unicode-zhuan-huan$ (str / a b b1 b2 r x)
  13.           ;unicode转码
  14.     (if  (and str (= (type str) 'str))
  15.       (progn
  16.   (setq r "")
  17.   (while (/= "" (setq a (substr str 1 1)))
  18.     (setq str (substr str 2))
  19.     (if (= a "\\")
  20.       (progn
  21.         (setq b (substr str 1 1))
  22.         (setq str (substr str 2))
  23.         (cond
  24.     ((= b "u")
  25.      (setq b1 (substr str 1 2))
  26.      (setq b2 (substr str 3 2))
  27.      (setq str (substr str 5))
  28.      (setq x ($unicode10-zhuan-Str$
  29.          (list ($16-to-10$ b2) ($16-to-10$ b1))
  30.        )
  31.      )
  32.     )
  33.     (t
  34.      (setq x (strcat a b))
  35.     )
  36.         )
  37.       )
  38.       (setq x a)
  39.     )
  40.     (setq r (strcat r x))
  41.   )
  42.       )
  43.     )
  44.     r          ;返回
  45.   )
  46.   (defun $json-zhuan-lisp$ (str       /
  47.           atom-str-lst   curr-char
  48.           flag-arraylevel
  49.           flag-escape     flag-keylevel
  50.           flag-quote     lst-str
  51.           pre-char     s
  52.          )
  53.           ;Json 字符串转化为 lisp 列表
  54.     (if  str
  55.       (progn
  56.   (setq lst-str (vl-string->list str))
  57.   (setq flag-escape nil)
  58.   (setq flag-quote nil)
  59.   (setq flag-keylevel 0)
  60.   (setq flag-arraylevel 0)
  61.   (setq atom-str-lst '())
  62.   (while lst-str
  63.     (setq curr-char (car lst-str))
  64.     (cond
  65.       ((= (ascii "\\") curr-char)
  66.        (setq flag-escape (not flag-escape))
  67.        (setq atom-str-lst (cons curr-char atom-str-lst))
  68.       )
  69.       ((and (= (ascii "\"") curr-char)
  70.       (null flag-escape)
  71.        )
  72.        (setq flag-escape nil)
  73.        (setq flag-quote (not flag-quote))
  74.        (setq atom-str-lst (cons curr-char atom-str-lst))
  75.       )
  76.       (t
  77.        (setq flag-escape nil)
  78.        (if flag-quote
  79.          (setq atom-str-lst (cons curr-char atom-str-lst))
  80.          (cond
  81.      ((= (ascii "{") curr-char)
  82.       ;;对象 key/value mode
  83.       (setq flag-keylevel (1+ flag-keylevel))
  84.       (setq atom-str-lst (cons (ascii "(") atom-str-lst))
  85.      )
  86.      ((= (ascii "[") curr-char)
  87.       ;;array mode
  88.       (setq flag-arraylevel (1+ flag-arraylevel))
  89.       (if (= pre-char (ascii ":"))
  90.         (setq atom-str-lst
  91.          (cons (ascii "(") (cdddr atom-str-lst))
  92.         )
  93.         (setq atom-str-lst (cons (ascii "(") atom-str-lst))
  94.       )
  95.      )
  96.      ((= (ascii "}") curr-char)
  97.       ;;对象 key/value mode
  98.       (setq flag-keylevel (1- flag-keylevel))
  99.       (setq atom-str-lst (cons (ascii ")") atom-str-lst))
  100.      )
  101.      ((= (ascii "]") curr-char)
  102.       ;;array mode
  103.       (setq flag-arraylevel (1- flag-arraylevel))
  104.       (setq atom-str-lst (cons (ascii ")") atom-str-lst))
  105.      )

  106.      ((= (ascii ":") curr-char)
  107.       ;; 处理 key
  108.       (setq  atom-str-lst
  109.        (cons (ascii " ")
  110.              (cons (ascii ".")
  111.              (cons (ascii " ") atom-str-lst)
  112.              )
  113.        )
  114.       )
  115.      )
  116.      ((= (ascii ",") curr-char)
  117.       ;; value
  118.       (setq  atom-str-lst
  119.        (cons (ascii "(")
  120.              (cons (ascii ")")
  121.              atom-str-lst
  122.              )
  123.        )
  124.       )
  125.      )
  126.      (t (setq atom-str-lst (cons curr-char atom-str-lst)))
  127.          )
  128.        )
  129.       )
  130.     )
  131.     (setq pre-char curr-char)
  132.     (setq lst-str (cdr lst-str))
  133.   )
  134.   (setq
  135.     s
  136.      (read
  137.        (strcat "(" (vl-list->string (reverse atom-str-lst)) ")")
  138.      )
  139.   )
  140.       )
  141.     )
  142.     s
  143.   )
  144.   (defun $unicode10-zhuan-Str$ (decList / stream result saFileGet)
  145.           ;将unicode编码的十进制数据表转换为字符串
  146.     (if  (and decList)
  147.       (progn
  148.   (if (and (setq stream (vl-catch-all-apply
  149.         'vlax-create-object
  150.         (list "Adodb.Stream")
  151.             )
  152.      )
  153.      (not (vl-catch-all-error-p stream))
  154.       )
  155.     (progn
  156.       (vlax-put-property stream 'Type 1)
  157.           ; 1二进制读取 2文本模式读取
  158.       (vlax-invoke stream 'Open)
  159.       ;; 打开流
  160.       (setq saFileGet (vl-catch-all-apply
  161.             'vlax-make-safearray
  162.             (list
  163.         17
  164.         (cons 0 (1- (length decList)))
  165.             )
  166.           )
  167.       )
  168.       ;; 创建SafeArray
  169.       (if  (vl-catch-all-error-p saFileGet)
  170.         (setq saFileGet nil)
  171.       )
  172.       (vl-catch-all-apply
  173.         'vlax-safearray-fill
  174.         (list saFileGet decList)
  175.       )
  176.       ;; 填充SafeArray
  177.       (vl-catch-all-apply
  178.         'Vlax-Invoke-Method
  179.         (list stream 'Write saFileGet)
  180.       )
  181.       ;; 写入二进制数据
  182.       (vl-catch-all-apply
  183.         'vlax-put-property
  184.         (list stream 'Position 0)
  185.       )
  186.       ;; 将位置重置为起始位置
  187.       (vl-catch-all-apply
  188.         'vlax-put-property
  189.         (list stream 'Type 2)
  190.       )        ; 2文本模式读取
  191.       (vl-catch-all-apply
  192.         'vlax-put-property
  193.         (list stream 'Charset "unicode")
  194.       )
  195.       (setq result (vl-catch-all-apply
  196.          'Vlax-Invoke-Method
  197.          (list stream 'ReadText nil)
  198.        )
  199.       )
  200.       ;; 读取文本数据
  201.       (vlax-release-object stream)
  202.       ;; 释放对象
  203.       (if  (vl-catch-all-error-p result)
  204.         (setq result nil)
  205.       )
  206.     )
  207.     (print "无法创建'Adodb.Stream'对象")
  208.   )
  209.       )
  210.     )
  211.     result        ;返回
  212.   )
  213.   (defun $str-zhuan-unicode$ (str / file_list fileget jg stream)
  214.           ;将任意字符串转换为unicode编码,返回十进制数据表
  215.     (if
  216.       (and (setq stream  (vl-catch-all-apply
  217.         'vlax-create-object
  218.         (list "Adodb.Stream")
  219.       )
  220.      )
  221.      (not (vl-catch-all-error-p stream))
  222.       )
  223.        (progn
  224.    (vl-catch-all-apply
  225.      'vlax-put-property
  226.      (list stream 'Type 2)
  227.    )        ; 1二进制读取 2文本模式读取
  228.    (vl-catch-all-apply
  229.      'vlax-put-property
  230.      (list stream 'Mode 3)
  231.    )        ; 1-读,2-写,3-读写
  232.    (vl-catch-all-apply
  233.      'vlax-put-property
  234.      (list stream 'Charset "unicode")
  235.    )        ; 设置编码为UTF-8
  236.    (vl-catch-all-apply 'vlax-invoke (list stream 'Open))
  237.    (vl-catch-all-apply
  238.      'vlax-invoke
  239.      (list stream 'WriteText str)
  240.    )
  241.    (vl-catch-all-apply
  242.      'vlax-put-property
  243.      (list stream 'Position 0)
  244.    )        ; 将位置重置为起始位置
  245.    (vl-catch-all-apply
  246.      'vlax-put-property
  247.      (list stream 'Type 1)
  248.    )        ; 1二进制读取 2文本模式读取
  249.    (setq FileGet (vl-catch-all-apply
  250.        'Vlax-Invoke-Method
  251.        (list stream 'Read nil)
  252.            )
  253.    )
  254.    (setq
  255.      File_list (vl-catch-all-apply
  256.            'vlax-safearray->list
  257.            (list (vl-catch-all-apply
  258.              'vlax-variant-value
  259.              (list FileGet)
  260.            )
  261.            )
  262.          )
  263.    )
  264.    (vlax-release-object stream)
  265.    (setq jg (cddr File_list))  ;去除BOM
  266.        )
  267.        (princ "\n无法创建'Adodb.Stream'对象")
  268.     )
  269.     jg          ;返回
  270.   )


  271.   (defun $file->Base64$  (FileName / node size str stream xmldom)
  272.           ;文件转base64
  273.     (setq xmldom (vl-catch-all-apply
  274.        'vlax-create-object
  275.        (list "Microsoft.XMLDOM")
  276.      )
  277.     )
  278.     (setq node (vl-catch-all-apply
  279.      'vlax-invoke-method
  280.      (list xmldom 'CreateElement "TEST")
  281.          )
  282.     )
  283.     (vl-catch-all-apply
  284.       'vlax-put-Property
  285.       (list node 'DataType "bin.base64")
  286.     )
  287.     (setq stream (vl-catch-all-apply
  288.        'vlax-create-object
  289.        (list "ADODB.Stream")
  290.      )
  291.     )
  292.     (vl-catch-all-apply
  293.       'vlax-put-Property
  294.       (list stream 'type 1)
  295.     )
  296.     (vl-catch-all-apply 'Vlax-Invoke (list stream 'open))
  297.     (vl-catch-all-apply
  298.       'vlax-invoke-method
  299.       (list
  300.   stream
  301.   'LoadFromFile
  302.   FileName
  303.       )
  304.     )
  305.     (setq
  306.       size (vl-catch-all-apply 'vlax-get-Property (list stream 'size))
  307.     )
  308.     (vl-catch-all-apply
  309.       'vlax-put-Property
  310.       (list
  311.   node
  312.   'NodeTypedValue
  313.   (Vlax-Invoke-Method stream 'Read size)
  314.       )
  315.     )
  316.     (vl-catch-all-apply
  317.       'Vlax-Invoke-Method
  318.       (list stream 'close)
  319.     )
  320.     (setq str (vl-catch-all-apply 'vlax-get-Property (list node 'text)))
  321.     (and xmldom
  322.    (vl-catch-all-apply 'vlax-release-object (list xmldom))
  323.     )
  324.     str          ;返回
  325.   )
  326.   (defun $str-ti-huan$ (str a b)
  327.           ;字符串替换
  328.     (if  (and (= (type str) 'str)
  329.        (apply 'and
  330.         (mapcar (function (lambda (x) (= (type x) 'str)))
  331.           (setq a (if  (= (type a) 'list)
  332.               a
  333.               (list a)
  334.             )
  335.           )
  336.         )
  337.        )
  338.        (apply 'and
  339.         (mapcar (function (lambda (x) (= (type x) 'str)))
  340.           (setq b (if  (= (type b) 'list)
  341.               b
  342.               (mapcar (function (lambda (x) b)) a)
  343.             )
  344.           )
  345.         )
  346.        )
  347.   )
  348.       (setq str  ($str-duan-kai$ str a nil)
  349.       str  (apply
  350.       'strcat
  351.       (mapcar 'strcat
  352.         (car str)
  353.         (mapcar (function (lambda (x)
  354.                 (if (= "" x)
  355.             x
  356.             (nth (vl-position x a) b)
  357.                 )
  358.               )
  359.           )
  360.           (last str)
  361.         )
  362.       )
  363.     )
  364.       )
  365.       str
  366.     )
  367.   )

  368.   (defun $str-duan-kai$  (str splits f / a b i l s)
  369.           ;文字断开
  370.     (if  (and str splits (= (type str) 'str) (= (type splits) 'list))
  371.       (progn
  372.   (if f
  373.     (setq
  374.       str  (vl-list->string (vl-remove 32 (vl-string->list str)))
  375.     )
  376.   )
  377.   (while (< "" str)
  378.     (if
  379.       (vl-remove
  380.         'nil
  381.         (mapcar (function (lambda (x) (vl-string-search x str)))
  382.           splits
  383.         )
  384.       )
  385.        (setq i   (car
  386.        (vl-sort
  387.          (vl-remove
  388.            'nil
  389.            (mapcar
  390.              (function
  391.          (lambda (x)
  392.            (if (setq l (vl-string-search x str))
  393.              (cons l x)
  394.            )
  395.          )
  396.              )
  397.              splits
  398.            )
  399.          )
  400.          (function (lambda (s1 s2) (< (car s1) (car s2))))
  401.        )
  402.            )
  403.        a   (cons (substr str 1 (car i)) a)
  404.        b   (cons (cdr i) b)
  405.        str (substr str (+ (car i) (strlen (cdr i)) 1))
  406.        )
  407.        (setq a   (cons str a)
  408.        b   (cons "" b)
  409.        str ""
  410.        )
  411.     )
  412.   )
  413.   (setq s (list (reverse a) (reverse b)))
  414.       )
  415.     )
  416.     s          ;返回
  417.   )
  418.   (defun $16-to-10$ (n / 16-10 f i ii j m)
  419.           ;16进制转10进制
  420.     (if  (and n (= (type n) 'str))
  421.       (progn
  422.   (setq n (strcase n))
  423.   (setq i      0
  424.         j      (strlen n)
  425.         m      0
  426.         16-10 '(("0" 0)
  427.           ("1" 1)
  428.           ("2" 2)
  429.           ("3" 3)
  430.           ("4" 4)
  431.           ("5" 5)
  432.           ("6" 6)
  433.           ("7" 7)
  434.           ("8" 8)
  435.           ("9" 9)
  436.           ("A" 10)
  437.           ("B" 11)
  438.           ("C" 12)
  439.           ("D" 13)
  440.           ("E" 14)
  441.           ("F" 15)
  442.          )
  443.   )
  444.   (repeat  j
  445.     (setq
  446.       f  (substr n j 1)
  447.       ii (cadr (assoc f 16-10))
  448.       m  (+ m (* (expt 16 i) ii))
  449.       i  (1+ i)
  450.       j  (1- j)
  451.     )
  452.   )
  453.       )
  454.     )
  455.     m          ;返回
  456.   )
  457.           ;奔跑
  458.   (or ip (setq ip "http://127.0.0.1"))
  459.   (or port (setq port "1224"))
  460.   (setq  b64 ($file->Base64$ imgpath)
  461.   b64 ($str-ti-huan$ b64 "\n" "")
  462.   )
  463.   (setq  json
  464.    (strcat
  465.      "{"          "\"base64\":\""   b64
  466.      "\","        "\"options\":{"
  467.      "\"data.format\":\"text\""     "}"
  468.      "}"
  469.     )
  470.   )
  471.   (setq  http (vl-catch-all-apply
  472.          'vlax-create-object
  473.          (list "Msxml2.XMLHTTP")
  474.        )
  475.   )
  476.   (if (vl-catch-all-error-p http)
  477.     (progn (print "创建Msxml2.XMLHTTP对象失败") (setq http nil))
  478.   )
  479.   (setq url (strcat ip ":" port "/api/ocr"))
  480.   (cond
  481.     ((and ip (wcmatch ip "[,*`:[0-9]*,]"))
  482.      (setq url (strcat ip "/api/ocr"))
  483.     )
  484.     (t
  485.      (setq url (strcat ip ":" port "/api/ocr"))
  486.     )
  487.   )
  488.   (setq  open-zt  (vl-catch-all-apply
  489.       'vlax-invoke
  490.       (list http 'Open "POST" url 0)
  491.     )
  492.   )
  493.   (vlax-invoke
  494.     http
  495.     'SetRequestHeader
  496.     "Content-Type"
  497.     "application/json"
  498.   )
  499.   (setq
  500.     Send-zt (vl-catch-all-apply 'vlax-invoke (list http 'Send json))
  501.   )
  502.   (if (vl-catch-all-error-p Send-zt)
  503.     (print "umi-ocr.exe可能没启动,或者是端口号不对导致send失败"
  504.     )
  505.   )
  506.   (setq i 0)
  507.   (while (and (/= (vl-catch-all-apply
  508.         'vlax-get-property
  509.         (list http 'readyState)
  510.       )
  511.       4
  512.         )
  513.         (< i 500)
  514.    )
  515.     (REPEAT 5000)
  516.     (SETQ i (1+ i))
  517.   )
  518.   (if
  519.     (and http
  520.    (/= (vl-catch-all-apply 'vlax-get-property (list http 'status))
  521.        200
  522.    )
  523.     )
  524.      (print "umi-ocr.exe可能没启动,或者是端口号不对")
  525.   )
  526.   (setq  resp (vl-catch-all-apply
  527.          'vlax-get-property
  528.          (list http 'responseText)
  529.        )
  530.   )
  531.   (if http
  532.     (vlax-release-object http)
  533.   )
  534.   (setq str ($unicode-zhuan-huan$ resp))
  535.   (setq lst ($json-zhuan-lisp$ str))
  536.   (setq data (cdr (assoc "data" lst)))
  537.   data
  538. )
  539. (defun c:tt (/ data lst result str)
  540.   (setq
  541.     data ($umi-ocr-http$ "http://127.0.0.1" "1224" "C:\\1.png" nil)
  542.   )
  543. )



网友答: 强烈点赞,楼主大牛

网友答: ($umi-ocr-http$ "http://127.0.0.1" "1224" "C:\\1.png" nil)中1224是什么东西?

网友答:
自贡黄明儒 发表于 2026-2-5 07:19
($umi-ocr-http$ "http://127.0.0.1" "1224" "C:\\1.png" nil)中1224是什么东西?

1224是端口号吧

网友答: 太高端了  不知道如何用  专门查了下端口号  但是仍连接不上  显示  "umi-ocr.exe可能没启动,或者是端口号不对"   

网友答: 本帖最后由 tryhi 于 2026-2-5 11:21 编辑
自贡黄明儒 发表于 2026-2-5 07:19
($umi-ocr-http$ "http://127.0.0.1" "1224" "C:\\1.png" nil)中1224是什么东西?

1224是umi-ocr的默认端口号,其实这个umi-ocr的参数挺多的,可以返回文字坐标,也支持二维码扫码什么的

网友答: 可以打开了   原来以为是连接网上的东西自动识别   后来发现要先下载app安装    哈哈  

网友答: 本帖最后由 guosheyang 于 2026-2-5 12:16 编辑

   

        请教大佬们,如何利用该ocr的坐标功能,返回cad中图片识别文字的坐标呢,即每个识别后的文字相对于图片左下角左上角点的相对坐标,这样就可以识别cad中的图片文字,并置于原来栅格文字的位置,大小完全重合,以前看到过有人实现过此功能,不知道是咋实现的,谢谢!


网友答: 识别了,厉害。
https://bbs.mjtd.com/forum.php?mod=attachment&aid=MTQ4ODc5fDJjMDg3NmUzOTFiOTBlNDZjMDMwYTNiNDRjOWYwYjkyfDE3NzAzOTg2MzE%3D&request=yes&_f=.png

网友答: 每个字分组,获取该组左下角坐标,识别文字后插到这个坐标
  • 上一篇:lwpolyline加段的写法
  • 下一篇:没有了