Vla-getxrecorddata

提供:GizmoLabs - だいたい CAD LISP なサイト
2016年1月19日 (火) 18:02時点におけるGizmon (トーク | 投稿記録)による版 (ページの作成:「{{AutoLISP}} ; 構文 : (vla-getxrecorddata ''vla-object'' '''' '''' '''') ; 機能 : ディクショナリに関連付けられている拡張レコード データ(XR...」)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
構文
(vla-getxrecorddata vla-object ' ' ')


機能
ディクショナリに関連付けられている拡張レコード データ(XRecordData)を取得する。


引数
  • vla-object … XRecord の VLAオブジェクト
  • XRecordDataType … 拡張レコード(XRecord)データの各値の DXF グループ コード値を表す短整数値の配列。バリアント型(短整数型配列)
  • XRecordDataValue …拡張レコード(XRecord)データを構成する値の配列。バリアント型(バリアント型配列)


戻り値
nil


  • MEMO: XRecord オブジェクトは、任意のデータの保存および管理に使用される。このオブジェクトは XData のコンセプトと同様だが、サイズまたは順位の制限を受けない。
  • XData とは違い、XRecord は値が 1000 未満の標準 CAD グループ コードのすべてで使用できる。標準の CAD グループ コードがすべてサポートされている。つまり、通常使用されるデータ タイプのすべてに加え、XRecord はオブジェクト ID を格納することができる。これにより、XRecord は他の XRecord を含む他のオブジェクトを所有することができる。
  • 次のグループ コードはすべての XRecord オブジェクトで共通。
    • グループ コード … [説明]
    • 100 … サブクラス マーカー(AcDbXrecord)
  • 1 ~ 369 (5 と 105 を除く) 値は、任意の方法でアプリケーションが使用することができる。


サンプル
(vl-load-com)
(defun c:Example_SetXRecordData()
    ;; 新しい XRECORD を作成し、XRECORDデータを追加して読み出すサンプル。
    ;; 複数回サンプルを実行し、データが追加されるのを参照してください。
    (setq acadObj (vlax-get-acad-object))
    (setq doc (vla-get-ActiveDocument acadObj))
    
    ;; 他のXRECORDデータからこのXRECORDデータを区別するためにユニークな識別子をつける
    (setq TYPE_STRING 1
          TAG_DICTIONARY_NAME "ObjectTrackerDictionary"
          TAG_XRECORD_NAME "ObjectTrackerXRecord")

    ;; XRECORD を格納するためにここでディクショナリに接続
    (setq dictionaries (vla-get-Dictionaries doc))
    (setq TrackingDictionary (vl-catch-all-apply 'vla-Item (list dictionaries TAG_DICTIONARY_NAME)))

    ;; (= (vl-catch-all-error-message TrackingDictionary) "Automation Error. Key not found")
  
    (if (= (type TrackingDictionary) 'VLA-OBJECT)
        (setq TrackingXRecord (vla-GetObject TrackingDictionary TAG_XRECORD_NAME))
        (progn
            ;; Create the objects that hold this XRecordData
            (setq TrackingDictionary (vla-Add dictionaries TAG_DICTIONARY_NAME))
            (setq TrackingXRecord  (vla-AddXRecord TrackingDictionary TAG_XRECORD_NAME))
	       )
    )

    ;; 現在の XRecordData
    (vla-GetXRecordData TrackingXRecord 'temp-XRecordDataType 'temp-XRecordData)
    
    ;; 配列が存在しない場合は作成
    (setq ArraySize 0)
    (if (/= temp-XRecordDataType nil)
        (progn
            (setq ArraySize (vlax-safearray-get-u-bound temp-XRecordDataType 1))
            (setq XRecordDataType (vlax-make-safearray vlax-vbInteger (cons 0 (1+ ArraySize))))
            (setq XRecordData (vlax-make-safearray vlax-vbVariant (cons 0 (1+ ArraySize))))

            (setq iCount 0)
            (while (>= ArraySize iCount)
                ;; このエレメントのインフォメーション
                (setq DataType (vlax-safearray-get-element temp-XRecordDataType iCount))
                (setq Data (vlax-variant-value (vlax-safearray-get-element temp-XRecordData iCount)))

                (vlax-safearray-put-element XRecordDataType iCount DataType)
                (vlax-safearray-put-element XRecordData iCount Data)

                (setq iCount (1+ iCount))
            )
       )
       (progn
            (setq XRecordDataType (vlax-make-safearray vlax-vbInteger '(0 . 0)))
            (setq XRecordData (vlax-make-safearray vlax-vbVariant '(0 . 0)))
       )
    )
    
    ;; 新しいレコードデータを追加
    ;; For this sample we only append the current time to the XRecord
    (vlax-safearray-put-element XRecordDataType ArraySize TYPE_STRING)
    (setq cdate (rtos (vlax-variant-value (vla-GetVariable doc "CDATE")) 2 6))
    (vlax-safearray-put-element 
        XRecordData 
        ArraySize 
        (strcat (substr cdate 5 2) "/"
                (substr cdate 7 2) "/"
                (substr cdate 1 4) "-"
                (substr cdate 10 2) ":"
                (substr cdate 12 2) ":"
                (substr cdate 14)))
    (vla-SetXRecordData TrackingXRecord XRecordDataType XRecordData)
    
    ;; すべてXRECORDデータエントリを読みだし
    (vla-GetXRecordData TrackingXRecord XRecordDataType XRecordData)
    (setq ArraySize (vlax-safearray-get-u-bound XRecordDataType 1))
    
    ;; 取得したレコードデータを表示
    (setq iCount 0
	         msg "")
    (while (>= ArraySize iCount)
        ;; Get information for this element
        (setq DataType (vlax-safearray-get-element XRecordDataType iCount))
        (setq Data (vlax-variant-value (vlax-safearray-get-element XRecordData iCount)))

        (if (= DataType TYPE_STRING)
            (setq msg (strcat msg Data "\n"))
        )
      
        (setq iCount (1+ iCount))
    )
    
    (alert (strcat "The data in the XRecord is: \n\n" msg))
)

関連事項