「Sqlitelsp」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
編集の要約なし
編集の要約なし
31行目: 31行目:
* [[DSQL_KEYWORDS]]
* [[DSQL_KEYWORDS]]
* [[DSQL_FUNCLIST]]
* [[DSQL_FUNCLIST]]
サンプル
* 引用:https://bricscadapi.wordpress.com/2010/08/25/sqlite-and-lisp-part1/
<pre class="brush:autolisp;">
; テーブル作成例
(DEFUN C:CREATETABLE (/ db)
  (SETQ DB "C:\\MySQLite.db")
  (DSQL_OPEN DB)
  (DSQL_DML DB "CREATE TABLE Products (ID INT unique, Name TEXT, Desc TEXT, Cost FLOAT);")
  ;
  (DSQL_DML DB "begin transaction;")
  (DSQL_DML DB "REPLACE INTO Products VALUES (1,'シンク12x12','12x12 Sink', %g );" 175.50)
  (DSQL_DML DB "REPLACE INTO Products VALUES (2,'シンク18x24','18x24 Sink', %g );" 185.50)
  (DSQL_DML DB "REPLACE INTO Products VALUES (3,'シンク24x24','24x24 Sink', %g );" 205.50)
  (DSQL_DML DB "commit transaction;")
  ;
  (DSQL_CLOSE DB)
)
; ファイル内のブロックを検索・集計して、結果を XML ファイルに書き込むシンプルな Lisp ルーチン
(defun listXML (ls / itm sl str tstr)
  (setq str ""
        str (strcat str "<?xml version=\"1.0\" encoding=\"utf-8\" ?><products>"))
  (foreach sl ls
    (setq str (strcat str "<product ") tstr "")
    (foreach itm sl
      (setq tstr (strcat tstr (vl-princ-to-string (car itm)) "=\"" (vl-princ-to-string (cdr itm)) "\" "))
    )
    (setq str (strcat str tstr " />"))
  )
  (setq str (strcat str "</products>"))
)
(defun getTotal (ls / cnt e1 e2 len lsout)
  (setq lsout '())
  (setq ls (vl-sort ls
        (function (lambda (e1 e2)
              (< (cdr(car e1)) (cdr(car e2)))))))   
  ;CAB @ TheSwamp                         
  (while (setq itm (car ls))
    (setq len (length ls)
          ls (vl-remove itm ls)
          cnt (- len (length ls))
          lsout (cons (cons (cons "QTY" cnt ) itm) lsout)
    )
  )
)
(defun c:doit (/ activedocument c db iacadapplication  modelspace s)
  (vl-load-com)
  (setq ls '()
        DB "C:\\MySQLite.db"
        s (ssget (list (cons 0 "INSERT")))
        c 0
  )
  (if s
    (progn
      (DSQL_OPEN DB)
      (While (< c (sslength s))
        (setq e (vlax-ename->vla-object (cdr (car (entget (ssname s c)))))
              res (DSQL_ASSOCQUERY DB "SELECT * FROM Products where Name=('%s');" (vlax-get e 'name))
        )
        (if res
          (setq ls (append(list res) ls))
        )
        (setq c (1+ c))
      )
      (DSQL_CLOSE DB)
    )
    (alert (strcat "製品が見つからなったよ"))
  )
  (setq fl (open "c:\\bom.xml" "w"))
  (princ(listXML(getTotal  ls)) fl)
  (close fl)
  (princ)
)
</pre>

2022年12月8日 (木) 06:47時点における版

SQLiteLsp 関数


AutoLISP からデータベースを操作するのは Microsoft ActiveX Data Objects (ADO) を使う方法がありますが、軽い Sqlite 直接操作したいねっていうことでなんやかんややられて SQLiteLsp として公開されている ARX アドオンによる LISP 関数のメモです。

  • AutoCAD, BricsCAD, ZWCAD で使える。(2022年7月現在)

入手先とか細かいところはフォーラムのスレッドを読むといいでしょう。 theswamp.org

SQLiteLsp の関数


サンプル

; テーブル作成例
(DEFUN C:CREATETABLE (/ db)
  (SETQ DB "C:\\MySQLite.db")
  (DSQL_OPEN DB)
  (DSQL_DML DB "CREATE TABLE Products (ID INT unique, Name TEXT, Desc TEXT, Cost FLOAT);")
  ;
  (DSQL_DML DB "begin transaction;")
  (DSQL_DML DB "REPLACE INTO Products VALUES (1,'シンク12x12','12x12 Sink', %g );" 175.50)
  (DSQL_DML DB "REPLACE INTO Products VALUES (2,'シンク18x24','18x24 Sink', %g );" 185.50)
  (DSQL_DML DB "REPLACE INTO Products VALUES (3,'シンク24x24','24x24 Sink', %g );" 205.50)
  (DSQL_DML DB "commit transaction;")
  ;
  (DSQL_CLOSE DB)
)

; ファイル内のブロックを検索・集計して、結果を XML ファイルに書き込むシンプルな Lisp ルーチン
(defun listXML (ls / itm sl str tstr)
  (setq str ""
        str (strcat str "<?xml version=\"1.0\" encoding=\"utf-8\" ?><products>"))
  (foreach sl ls
    (setq str (strcat str "<product ") tstr "")
    (foreach itm sl
      (setq tstr (strcat tstr (vl-princ-to-string (car itm)) "=\"" (vl-princ-to-string (cdr itm)) "\" "))
    )
    (setq str (strcat str tstr " />"))
  )
  (setq str (strcat str "</products>"))
)
 
(defun getTotal (ls / cnt e1 e2 len lsout)
  (setq lsout '())
  (setq ls (vl-sort ls
        (function (lambda (e1 e2)
              (< (cdr(car e1)) (cdr(car e2)))))))    
   ;CAB @ TheSwamp                           
  (while (setq itm (car ls))
    (setq len (length ls)
          ls (vl-remove itm ls)
          cnt (- len (length ls))
          lsout (cons (cons (cons "QTY" cnt ) itm) lsout)
    )
  )
)
 
(defun c:doit (/ activedocument c db iacadapplication  modelspace s)
  (vl-load-com)
  (setq ls '()
        DB "C:\\MySQLite.db"
        s (ssget (list (cons 0 "INSERT")))
        c 0
  )
  (if s
    (progn
      (DSQL_OPEN DB)
      (While (< c (sslength s))
        (setq e (vlax-ename->vla-object (cdr (car (entget (ssname s c)))))
              res (DSQL_ASSOCQUERY DB "SELECT * FROM Products where Name=('%s');" (vlax-get e 'name))
        )
        (if res
          (setq ls (append(list res) ls))
        )
        (setq c (1+ c))
      )
      (DSQL_CLOSE DB)
    )
    (alert (strcat "製品が見つからなったよ"))
  )
  (setq fl (open "c:\\bom.xml" "w"))
  (princ(listXML(getTotal  ls)) fl)
  (close fl)
  (princ)
)