level 3
ybmou1516
楼主
先说一下宏的作用,黑色小伙伴对宏不是很了解。简单说下,宏其实就是一个VBS编程语言,如果你用过魔镜之类的插件也是通过VBS来编程的。而适当了解一下宏对你的工作也有很大的帮助,它可以帮你完成一些重复性的工作。
这里讲一下本人工作中遇着一种非常伤心的工作。如下图

对每个楼层平面图进行编号。注意:编号的顺序是采反“C”型以小大到,而部份编号是组合号如“1-9,10”。数量少可以用手工编号那么像下图的这样的工作量,你是不是马上就头痛?

统计了一下共计1193个编号,而且共有3份这样的图纸,还有更要命的是客户会提供每个房号的面积、租金单价、租用人、电话等信息放置在此定房号位置。
看来想用人工去完成,一个非常大的工作量,只有动下歪脑筋,(比竟是人玩电脑,不是电脑玩人)
设计师对拿到任务时,第一时间因考虑处理问题的方法,而不是第一时间打开软件就开始设计。
本人的方法是:
1、人工去做决不行,必须采用编程方法完成。
2、决定编程,并使用CDR自带的宏来搞定。
3、开始动手
整体思路:
1、整理所有编号的数据
通过s1 = lr1.CreateArtisticText(0, 0,“ txt“)语句逐步向CDR内输入编号数据。
//创建一个文本文字坐标为0,0的“TXT”对象
2、文字对象定位的问题
由于要用宏去获取每个文字对象的相对位移数据是很困难的事,必须要先给这些编号数据提前找到参照坐标点或块然后使用CDR里居中命令,让创建的文本对象居中于参照对象。
这里我新建了一“数据层”。“数据层”内的所有对象都是为编号文本文字对象定位服务的。如下图:

建造这些对象有个小办法,使用“智能填充工作”(好像X6版以上才有),点下封闭的路径块就可以自己建创了,另外最好是倒序建创。因为CDR宏里默认最上层的对像为Shapes(1)“也就是第1个对象”,而每次新建一个对象都会将新建的对象置顶,依次类推。为什么要倒序?这为下面对象重命名提供了方便。
这里截取部份对象重命名的代码:
dim F1(19)
REM 定义一个“F1”上标为19的数组
F1(1) = "A1#1-1"
F1(2) = "A1#1-2"
F1(3) = "A1#1-3"
F1(4) = "A1#1-4"
F1(5) = "A1#1-5"
F1(6) = "A1#1-6"
F1(7) = "A1#1-7,8"
F1(8) = "A1#1-9,10"
F1(9) = "A1#1-11"
F1(10) = "A1#1-12"
F1(11) = "A1#1-13"
F1(12) = "A1#1-14"
F1(13) = "A1#1-15"
F1(14) = "A1#1-16"
F1(15) = "A1#1-17"
F1(16) = "A1#1-18"
F1(17) = "A1#1-19"
F1(18) = "A1#1-20"
F1(19) = "A1#1-21"
rem 以上的字符串,可以在EXecl内整理好复制过来
dim Ls as shapes
rem 定义一个LS的变量为形状类型
For i = 1 To19
rem i为1开头,主要是没有Shapes(0)“对象0”,0表示第几个对象
set LS=ActiveDocument.Pages(1).Layers("数据层").Shapes(i)
rem 设置LS为当前文档的第1个页面的数据层中第I个对象
LS.ObjectData("Name").Value = F1(i)
rem 设置LS对象的名称为F1(i)
next
以上代码就可以自动将对象重新的批量命名
WHY?为什么要重新命名?
ActiveDocument.Pages(1).Layers("数据层").Shapes(i) //这个指定语句是某个对象的绝对路径,
其中所有的整数值可以改成字符串,重新为每个对象命名后,就不怕对象打乱后找不到对应顺序,命名后每个对象就像拥有一个唯的ID,随便怎么跑,只要不删除,都可以用语句找到你。
#
进入重要的工作:自动编号
自动编号实际在CDR里就是输入一段文本文字。然后与对应的数据层中的参照对象居中(也就是定位)。
前面所有的参照对像有了唯一的ID,这事就好办了。
dim F1(19)
REM 定义一个“F1”上标为19的数组
F1(1) = "A1#1-1"
F1(2) = "A1#1-2"
F1(3) = "A1#1-3"
F1(4) = "A1#1-4"
F1(5) = "A1#1-5"
F1(6) = "A1#1-6"
F1(7) = "A1#1-7,8"
F1(8) = "A1#1-9,10"
F1(9) = "A1#1-11"
F1(10) = "A1#1-12"
F1(11) = "A1#1-13"
F1(12) = "A1#1-14"
F1(13) = "A1#1-15"
F1(14) = "A1#1-16"
F1(15) = "A1#1-17"
F1(16) = "A1#1-18"
F1(17) = "A1#1-19"
F1(18) = "A1#1-20"
F1(19) = "A1#1-21"
Set lr1 = ActiveDocument.Pages(1).CreateLayer("1F编号")
REM 设置一个lr1为在当前文档中的第1个页面创建一个名为“1F编号”的图层
for i=1 to 19
txt = Mid(F1(i), InStr(1, F1(i), "#") + 1, Len(F1(i)))
REM 截取“#”号以后的字符串为并保存在TXT变量内
Set s1 = lr1.CreateArtisticText(0, 0, txt)
rem 在lr1图层中创建1个文本文字,内容为txt变量内的字符串
ActiveDocument.CreateShapeRangeFromArray(ActiveDocument.Pages(1).Layers("数据层1").Shapes(F1(i)), s1).AlignAndDistribute cdrAlignDistributeHNone, cdrAlignDistributeVAlignCenter, cdrAlignShapesToLastSelected, cdrDistributeToSelection, False, cdrTextAlignBoundingBox
ActiveDocument.CreateShapeRangeFromArray(ActiveDocument.Pages(1).Layers("数据层1").Shapes(F1(i)), s1).AlignAndDistribute cdrAlignDistributeHAlignCenter, cdrAlignDistributeVNone, cdrAlignShapesToLastSelected, cdrDistributeToSelection, False, cdrTextAlignBoundingBox
REM 选择“”数据层“中的名字叫F1(i)名字的对象和刚才创建的文本文字居中
next
保存宏,并执行宏。
自动编号就完成了!!!!!
黑爽有木有?
有了这样的一个数据层,如果客户还要求将每个房间的租用信息,面积,预租人,电话等信息都要录入的话。也可以用此类方法编写。了解一点VB的基础、函数也不必知道太多。只要用时对查了一下相关网,找到自己想要的函数,现学现用也是很快的。
------------------------------------------------
本篇文章对初学者可能有点难度。只能对初学者影响一种兴趣,举一反三。
以上语法和公式,都是自己慢慢通过宏的录制功能测试出来的。拿到GOOGLE翻译里看一下到底是什么意思,然后一步一步测试。
————————————————————————————————————————————————
有时想问自己:一个平面设计真需要懂编程么?我个人觉得多少要了解些。不然像这样体力活,又耗精力,又耗体力。几串代码能搞定的事,为什么非要让电脑来玩人。
2017年05月26日 09点05分
1
这里讲一下本人工作中遇着一种非常伤心的工作。如下图

对每个楼层平面图进行编号。注意:编号的顺序是采反“C”型以小大到,而部份编号是组合号如“1-9,10”。数量少可以用手工编号那么像下图的这样的工作量,你是不是马上就头痛?
统计了一下共计1193个编号,而且共有3份这样的图纸,还有更要命的是客户会提供每个房号的面积、租金单价、租用人、电话等信息放置在此定房号位置。看来想用人工去完成,一个非常大的工作量,只有动下歪脑筋,(比竟是人玩电脑,不是电脑玩人)
设计师对拿到任务时,第一时间因考虑处理问题的方法,而不是第一时间打开软件就开始设计。
本人的方法是:
1、人工去做决不行,必须采用编程方法完成。
2、决定编程,并使用CDR自带的宏来搞定。
3、开始动手
整体思路:
1、整理所有编号的数据
通过s1 = lr1.CreateArtisticText(0, 0,“ txt“)语句逐步向CDR内输入编号数据。
//创建一个文本文字坐标为0,0的“TXT”对象
2、文字对象定位的问题
由于要用宏去获取每个文字对象的相对位移数据是很困难的事,必须要先给这些编号数据提前找到参照坐标点或块然后使用CDR里居中命令,让创建的文本对象居中于参照对象。
这里我新建了一“数据层”。“数据层”内的所有对象都是为编号文本文字对象定位服务的。如下图:

建造这些对象有个小办法,使用“智能填充工作”(好像X6版以上才有),点下封闭的路径块就可以自己建创了,另外最好是倒序建创。因为CDR宏里默认最上层的对像为Shapes(1)“也就是第1个对象”,而每次新建一个对象都会将新建的对象置顶,依次类推。为什么要倒序?这为下面对象重命名提供了方便。这里截取部份对象重命名的代码:
dim F1(19)
REM 定义一个“F1”上标为19的数组
F1(1) = "A1#1-1"
F1(2) = "A1#1-2"
F1(3) = "A1#1-3"
F1(4) = "A1#1-4"
F1(5) = "A1#1-5"
F1(6) = "A1#1-6"
F1(7) = "A1#1-7,8"
F1(8) = "A1#1-9,10"
F1(9) = "A1#1-11"
F1(10) = "A1#1-12"
F1(11) = "A1#1-13"
F1(12) = "A1#1-14"
F1(13) = "A1#1-15"
F1(14) = "A1#1-16"
F1(15) = "A1#1-17"
F1(16) = "A1#1-18"
F1(17) = "A1#1-19"
F1(18) = "A1#1-20"
F1(19) = "A1#1-21"
rem 以上的字符串,可以在EXecl内整理好复制过来
dim Ls as shapes
rem 定义一个LS的变量为形状类型
For i = 1 To19
rem i为1开头,主要是没有Shapes(0)“对象0”,0表示第几个对象
set LS=ActiveDocument.Pages(1).Layers("数据层").Shapes(i)
rem 设置LS为当前文档的第1个页面的数据层中第I个对象
LS.ObjectData("Name").Value = F1(i)
rem 设置LS对象的名称为F1(i)
next
以上代码就可以自动将对象重新的批量命名
WHY?为什么要重新命名?
ActiveDocument.Pages(1).Layers("数据层").Shapes(i) //这个指定语句是某个对象的绝对路径,
其中所有的整数值可以改成字符串,重新为每个对象命名后,就不怕对象打乱后找不到对应顺序,命名后每个对象就像拥有一个唯的ID,随便怎么跑,只要不删除,都可以用语句找到你。
#
进入重要的工作:自动编号
自动编号实际在CDR里就是输入一段文本文字。然后与对应的数据层中的参照对象居中(也就是定位)。
前面所有的参照对像有了唯一的ID,这事就好办了。
dim F1(19)
REM 定义一个“F1”上标为19的数组
F1(1) = "A1#1-1"
F1(2) = "A1#1-2"
F1(3) = "A1#1-3"
F1(4) = "A1#1-4"
F1(5) = "A1#1-5"
F1(6) = "A1#1-6"
F1(7) = "A1#1-7,8"
F1(8) = "A1#1-9,10"
F1(9) = "A1#1-11"
F1(10) = "A1#1-12"
F1(11) = "A1#1-13"
F1(12) = "A1#1-14"
F1(13) = "A1#1-15"
F1(14) = "A1#1-16"
F1(15) = "A1#1-17"
F1(16) = "A1#1-18"
F1(17) = "A1#1-19"
F1(18) = "A1#1-20"
F1(19) = "A1#1-21"
Set lr1 = ActiveDocument.Pages(1).CreateLayer("1F编号")
REM 设置一个lr1为在当前文档中的第1个页面创建一个名为“1F编号”的图层
for i=1 to 19
txt = Mid(F1(i), InStr(1, F1(i), "#") + 1, Len(F1(i)))
REM 截取“#”号以后的字符串为并保存在TXT变量内
Set s1 = lr1.CreateArtisticText(0, 0, txt)
rem 在lr1图层中创建1个文本文字,内容为txt变量内的字符串
ActiveDocument.CreateShapeRangeFromArray(ActiveDocument.Pages(1).Layers("数据层1").Shapes(F1(i)), s1).AlignAndDistribute cdrAlignDistributeHNone, cdrAlignDistributeVAlignCenter, cdrAlignShapesToLastSelected, cdrDistributeToSelection, False, cdrTextAlignBoundingBox
ActiveDocument.CreateShapeRangeFromArray(ActiveDocument.Pages(1).Layers("数据层1").Shapes(F1(i)), s1).AlignAndDistribute cdrAlignDistributeHAlignCenter, cdrAlignDistributeVNone, cdrAlignShapesToLastSelected, cdrDistributeToSelection, False, cdrTextAlignBoundingBox
REM 选择“”数据层“中的名字叫F1(i)名字的对象和刚才创建的文本文字居中
next
保存宏,并执行宏。
自动编号就完成了!!!!!
黑爽有木有?
有了这样的一个数据层,如果客户还要求将每个房间的租用信息,面积,预租人,电话等信息都要录入的话。也可以用此类方法编写。了解一点VB的基础、函数也不必知道太多。只要用时对查了一下相关网,找到自己想要的函数,现学现用也是很快的。
------------------------------------------------
本篇文章对初学者可能有点难度。只能对初学者影响一种兴趣,举一反三。
以上语法和公式,都是自己慢慢通过宏的录制功能测试出来的。拿到GOOGLE翻译里看一下到底是什么意思,然后一步一步测试。
————————————————————————————————————————————————
有时想问自己:一个平面设计真需要懂编程么?我个人觉得多少要了解些。不然像这样体力活,又耗精力,又耗体力。几串代码能搞定的事,为什么非要让电脑来玩人。