;;----------------------------------------------------------------------------- ;; simple example how to implement BOM attributes using IK functions ;;----------------------------------------------------------------------------- (in-package :my-special-bom-attr) (use-package '( :oli )) ;;----------------------------------------------------------------------------- ;; functions to inquire attached BOM information of an SD part or assembly ;;----------------------------------------------------------------------------- (defun bomattr-get-material (object) (let ((attr (sd-inq-item-attribute object "MY_SPECIAL_BOM_ATTR" :values :attachment :contents))) (if attr (getf attr :material) nil) ) ) (defun bomattr-get-partno (object) (let ((attr (sd-inq-item-attribute object "MY_SPECIAL_BOM_ATTR" :values :attachment :contents))) (if attr (getf attr :part-number) nil) ) ) (defun bomattr-get-Heat_treat (object) (let ((attr (sd-inq-item-attribute object "MY_SPECIAL_BOM_ATTR" :values :attachment :contents))) (if attr (getf attr :Heat-treat) nil) ) ; add heat treat information ) ;;----------------------------------------------------------------------------- ;; dialog to attach BOM information to an SD part or assembly ;;----------------------------------------------------------------------------- (sd-defdialog 'my_special_bom_attr :toolbox-button t :dialog-title "BOM Attr" :start-variable 'object :variables '( (OBJECT :value-type :part-assembly :modifies :contents :title "Part/Assy" :prompt-text "Select a part or assembly." :after-input (progn (setq material (bomattr-get-material object)) (setq partno (bomattr-get-partno object)) (setq Heat_treat (bomattr-get-heat_treat object)) ) ) (MATERIAL :value-type :string :initial-value "" :Proposals ("Steel" "Aluminium" "Brass") :title "Material" :prompt-text "Enter material info." ) (PARTNO :value-type :string :title "Part No" :prompt-text "Enter part number info." ) (Heat_treat :range ("HRC40~45" "HRC58~60" "Case Hardening") :title "Heat Treat" :prompt-text "Enter Heat treatment info." ) ) :ok-action '(progn (sd-attach-item-attribute object "MY_SPECIAL_BOM_ATTR" :attachment :contents :on-copy :copy :on-merge :maintain :on-split :copy :on-xform :maintain :filing '(:sd-file) :values `( :material ,material :part-number ,partno :heat-treat ,heat_treat ) ) ) ) ;;----------------------------------------------------------------------------- ;; convenience functions to inquire attached BOM information ;;----------------------------------------------------------------------------- (defun bomattr-get-material (selitem) (let ((attr (sd-inq-item-attribute selitem "MY_SPECIAL_BOM_ATTR" :values :attachment :contents))) (if attr (getf attr :material) nil) ) ) (defun bomattr-get-partno (selitem) (let ((attr (sd-inq-item-attribute selitem "MY_SPECIAL_BOM_ATTR" :values :attachment :contents))) (if attr (getf attr :part-number) nil) ) ) (defun bomattr-get-Heat_treat (selitem) (let ((attr (sd-inq-item-attribute selitem "MY_SPECIAL_BOM_ATTR" :values :attachment :contents))) (if attr (getf attr :heat-treat) nil) ) ) ;;----------------------------------------------------------------------------- ;; examples of how to customize some simple BOM attributes ;;----------------------------------------------------------------------------- (defun my-bom-attr-part-name (selitem) (let ((contents-name (oli::sd-inq-obj-contents-name selitem))) (if contents-name contents-name (oli::sd-inq-obj-basename selitem)) ) ) (defun my-bom-attr-part-no (selitem) (let ((part-no (bomattr-get-partno selitem))) (if part-no part-no "") ) ) (defun my-bom-attr-material (selitem) (let ((material (bomattr-get-material selitem))) (if material material "") ) ) (defun my-bom-attr-heat_treat (selitem) (let ((Heat_treat (bomattr-get-heat_treat selitem))) (if Heat_treat Heat_treat "") ) ) (docu::docu-unregister-bom-attr-all) (docu::docu-register-bom-attr :attr-type "DOCU_BOM_QUANTITY" :attr-title "Quantity" :attr-display t :attr-value-fnc nil) ;; system bom attribute (docu::docu-register-bom-attr :attr-type "PART_NAME" :attr-title "Part Name" :attr-display t :attr-value-fnc #'my-bom-attr-part-name) (docu::docu-register-bom-attr :attr-type "PART_NO" :attr-title "Part No" :attr-display t :attr-value-fnc #'my-bom-attr-part-no) (docu::docu-register-bom-attr :attr-type "MATERIAL" :attr-title "Material" :attr-display t :attr-value-fnc #'my-bom-attr-material) (docu::docu-register-bom-attr :attr-type "Heat_treat" :attr-title "Heat_treat" :attr-display t :attr-value-fnc #'my-bom-attr-Heat_treat) ;;----------------------------------------------------------------------------- ;structure list display more information. ;;----------------------------------------------------------------------------- (oli::sd-create-column-definition :Material :title "Material" :alignment :right :display-fnc 'browser-display-Material :edit-fnc 'edit-attr-Material ;; Write a func ¡° edit-attr-Material ¡± ) (oli::sd-create-column-definition :Part_NO :title "Part_No." :alignment :right :display-fnc 'browser-display-Part_NO :edit-fnc nil ;; not editable ) (oli::sd-create-column-definition :Heat_treat :title "Heat_treat" :alignment :right :display-fnc 'browser-display-Heat_treat :edit-fnc nil ;; not editable ) ;;************************************************************************** ;; FUNCTIONS * ;*************************************************************************** ; (defun edit-attr-Material (node value) ; (let ((node-item (sd-pathname-to-obj (BrowserNode-objPath node))) (material (sd-pathname-to-obj (BrowserNode-objPath value)))) ; ) ;endlet ; ) ;enddefun (defun browser-display-Material (node) (let ((node-item (sd-pathname-to-obj (BrowserNode-objPath node)))) ( if (sd-inq-part-p node-item) (oli:sd-inq-item-attribute node-item "MY_SPECIAL_BOM_ATTR" :material :attachment :contents) "" ) ;endif );let ) (defun browser-display-Part_NO (node) (let ((node-item (sd-pathname-to-obj (BrowserNode-objPath node)))) ( if (sd-inq-part-p node-item) (oli:sd-inq-item-attribute node-item "MY_SPECIAL_BOM_ATTR" :part-number :attachment :contents) "" ) ;endif );let ) (defun browser-display-Heat_treat (node) (let ((node-item (sd-pathname-to-obj (BrowserNode-objPath node)))) ( if (sd-inq-part-p node-item) (oli:sd-inq-item-attribute node-item "MY_SPECIAL_BOM_ATTR" :heat-treat :attachment :contents) "" ) ;endif );let ) ;;************************************************************************** ;; BROWSER * ;*************************************************************************** (oli:sd-create-browser-view "Detail" :title "Detail" :tree-config '(:instance-name) :detail-config '(:Part_No :Material :heat_treat) )