• 【Visual Lisp】块专题


    ;;关于块

    ;;(0)模型空间→块表记录→块图元:顶层的是模型空间→模型空间下有很多图元和一些块表记录→块表记录又有很多图元(此时块表记录就相当于模型空间),一个块表记录可以有多个insert块→同一块表记录的insert块之间的属性可以不同,其他相同。

    ;;(1)图中entsel获取到的是insert块图元名

    ;;(2)块中可能含有属性,通过这个insert块图元名来获取和修改这个块的属性

    ;;(3)块中属性图元的上级对象是这个insert块;属性图元组码表的330对应就是这个Insert块图元名

    ;;(4)块中非属性图元的上级对象是对应的"BLOCK_RECORD"对象,但是用nentsel点选块内非属性图元,获取到的表最后一个就是当前Insert块的图元名。

    ;;(5)修改除了属性外的任何东西要用"BLOCK_RECORD"对象的的方法(比如块名)或者在块内新画一些图元(相当于在ModelSpace中作图)。

    ;;(6)insert块和块表记录对象的Name属性都是块名(vla-get-name 块图元名) (vla-get-name 块表记录对象)

    ;;在块内新增一个200的圆

    (vla-AddCircle(vla-Item*Blocks*"块名")(vlax-3D-point '(000))200)

    ;;块表记录
    ;;01.图纸内块表记录(AcDbBlockTableRecord)集合(包括ModelSpace和所有PaperSpace以及用户定义的块表记录)
    (setq *Blocks* (vla-get-Blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
    ;;02.创建可用的临时块名
    (setq blockNameStrLst nil)
    (vlax-for temptBlock *Blocks*
      (setq blockNameStrLst (cons (vla-get-Name temptBlock) blockNameStrLst))
    )
    (setq blockNameStrST T)
    (while blockNameStrST
      (setq temptBlockNameStr (vl-filename-base (vl-filename-mktemp nil nil nil)))
      (if (not (member temptBlockNameStr blockNameStrLst))
        (progn
          (setq blockNameStr temptBlockNameStr)
          (setq blockNameStrST nil)
        )
      )
    )
    ;;03.块表记录集合中新增块表记录(AcDbBlockTableRecord) blockNameStr
    (vla-add *Blocks* (vlax-3D-point '(0 0 0)) blockNameStr)
    ;;04.根据块表记录名获取块表记录对象
    (setq newBlockTableRecordObject (vla-Item *Blocks* blockNameStr))
    ;;05.在新增的块表记录中新增一个圆对象
    (setq newCircleObject (vla-AddCircle newBlockTableRecordObject (vlax-3D-point '(0 0 0)) 1000))
    ;;06.在新增的块表记录中新增一个单行文字属性对象
    (setq newTextAttributeObject (vla-AddAttribute newBlockTableRecordObject 300 acAttributeModeVerify "提示1" (vlax-3D-point '(60 -370 0)) "单行-关键字" "单行-默认值"))
    ;;07.在新增的块表记录中新增一个多行文字属性对象
    (setq newMTextAttributeObject (vla-AddAttribute newBlockTableRecordObject 300 acAttributeModeVerify "提示2" (vlax-3D-point '(75 -820 0)) "多行-关键字" "多行-默认值"))
    (vlax-put-property newMTextAttributeObject "MTextAttribute" -1) ;;将文字设置为多行文字属性
    (vlax-put-property newMTextAttributeObject "MTextBoundaryWidth" 4400) ;;设置多行文本的宽度


    ;;-----------------------------------------------------------------------------------------------------------


    ;;块
    ;;在模型空间中插入之前定义的块表记录为块(用块表记录名→即块名来插入)
    (vla-InsertBlock *ModelSpace* (vlax-3D-point (getpoint)) blockNameStr 1 1 1 0)
    ;;关于块中属性的获取和修改参照如下函数进行处理(属性的修改→通过属性对象进行)
    ;;功 能:获取块的属性列表
    ;;参 数:块图元名(ename)
    ;;返回值:nil或者块属性列表'(("属性名1" "属性值1" 属性对象1) ("属性名2" "属性值2" 属性对象2) ...)
    (defun HQ::GetInsertBlockAttributesLst(blockEntName / blockattributeslst blockobject)
      (setq blockAttributesLst nil)
      (if blockEntName
        (if (= (cdr (assoc 0 (entget blockEntName))) "INSERT")
          (if (= (vla-get-HasAttributes (setq blockObject (vlax-ename->vla-object blockEntName))) :vlax-true)
          (setq blockAttributesLst (mapcar '(lambda (x) (list (vla-get-TagString x) (vla-get-TextString x) x)) (vlax-safearray->list (vlax-variant-value (vla-getAttributes       blockObject)))))
          )
        )
      )
      blockAttributesLst
    )

    <<END>>

  • 相关阅读:
    log4j日志基本配置
    MyBatis基本应用
    Java properties配置文件
    Java DAO模式
    Java方式 MySQL数据库连接
    bug 复制代码没有审查,没有完全就该变量名
    cocos3 深入理解tiledmap
    cocos3 深入理解单例模式
    cocos3 CC_BREAK_IF(m_pGameMap==NULL);
    cocos2d3 宏定义屏幕宽高,这样就不用重复获取了
  • 原文地址:https://www.cnblogs.com/Helchan/p/4659454.html
Copyright © 2020-2023  润新知