[代理开发]文字分类统计

AutoCAD版本和对应的程序目录

AutoCAD2004-2006 sys16

AutoCAD2007-2009 sys17

AutoCAD2010-2012(32位) sys18

AutoCAD2013-2015(32位) sys19

AutoCAD2010-2012(62位) sys18(X64)

AutoCAD2013-2015(62位) sys19(X64)

 

1:加载您CAD版本对应程序目录下面的”TXTextPlus.arx”

2:输入命令”gztj”

3:选择需要统计的文字

4:拖曳结果在需要的位置生成文字结果

注意:生成的结果根据第一个统计文字拷贝生成

所以文字样式,图层都拷贝了第一个文字的

只有文字内容不一样,颜色为绿色,旋转角度为0

统计内容如下

 

钉|引钉;挂|引挂;管;管内;槽;桥架;架;引;吊;预留

 

钉|引钉,表示的意思是 钉 和 引钉 都统计为 钉 即第一个

 

你也可以通过修改配置文件”config\config.ini”

来调整统计内容

 

昨天提到的 “软吊” 没有统计出来可以将配置修改为

“钉|引钉;挂|引挂;管;管内;槽;桥架;架;引;吊;预留;软吊”

如果”软吊”也统计在”吊”里面

可以配置成

“钉|引钉;挂|引挂;管;管内;槽;桥架;架;引;吊|软吊;预留”

 

支持先选择,然后输入命令模式,同时支持输入命令后再选择模式

 

可以多选文字,没有关系的,不需要统计的会自动过滤掉

 

 

关于自动加载:

“工具”->”选项”或输入命令”op”

“文件”选项卡中在”支持文件搜索路径中”添加您CAD版本对应程序目录

 

插件下载:WenZiFenLeiTongJi20140620.zip

 

发表在 CAD实用软件 | 留下评论

[代理开发]桩号差|文字相减

AutoCAD版本和对应的程序目录

AutoCAD2004-2006 sys16

AutoCAD2007-2009 sys17

AutoCAD2010-2012(32位) sys18

AutoCAD2013-2015(32位) sys19

AutoCAD2010-2012(62位) sys18(X64)

AutoCAD2013-2015(62位) sys19(X64)

 

1:加载您CAD版本对应程序目录下面的”ZhuangHaoCha.arx”

2:输入命令”zhc”

3:选择第一个桩号|文字

4:选择第二个桩号|文字

5:拖曳结果在需要的位置生成文字结果

注意:生成的结果根据第一个桩号对应的文字拷贝生成

所以文字样式,图层,颜色等都拷贝了第一个文字的

只有文字内容不一样

支持整数和小树,结果的小数位数是两个文字的小数位数取大的一个

支持文字和多行文字

下载试用:ZhuangHaoCha 20140611

发表在 CAD实用软件 | 标签为 , , | 留下评论

[代理开发]VS同步精灵

下载VS同步精灵:VS同步精灵

使用帮助:本软件用于同步不同版本的VS包含的代码和资源文件

是CAD二次开发和其它需要用到多版本开发不可缺少的利器

1:工程文件为sln格式,支持VC6,VS2002,VS2003,VS2005,VS2008,VS2010,目前只支持C/C++工程

2:工程文件按顺序排列,第一个工程为标准工程,用做样板同步到后面的工程中

3:正则表达式匹配的是文件名的全小写格式,您配置的正则表达式中匹配内容需要手动配置成小写的                                                 作者:boitboy,QQ:245804736,网站:cadgj.com

发表在 ObjectArx | 标签为 | 留下评论

升级到正式版本1.0.8

百度云下载地址(优先,速度快):http://yun.baidu.com/share/link?shareid=3158826389&uk=721859502

备用本站下载地址:http://www.cadgj.com/GoodAssistantUpdate/HaoBangShou_1.0.8.exe

CAD好帮手1.0.8版本更新说明

更新日期:20140612

广告:庆祝自己双喜临门,特推出多达200枚一折注册码

原价50元,现价只要5元

详情请访问官网:CAD工具之家(http://www.cadgj.com)

更新内容:

1:修复了大量BUG,和专业的测试人员合作,测试出并修复了

大量BUG

2:增加了大量新功能,例如坐标标注,线型标注,标注断开,标注合并

3:增加了系统配置选项,方便大家个性化配置好帮手

4:增加了功能启用/隐藏功能,可以将自己不需要的功能隐藏起来

操作更加顺手

5:优化去除教育版戳记功能,最新版本已经完美支持各种CAD自定义实体

例如天正,理正的自定义对象

6:对文字转线功能也做了很好的优化,对宋体,黑体等以前处理不了的文字

现在都已经完美支持

7:优化了格式转换功能,解决了以前可能遇到到转换成高清晰度图纸时可能出现的

图纸倾斜以及其它各种问题

发表在 CAD好帮手发布 | 标签为 , , , | 留下评论

演示cad好帮手的批量打印

演示最新稳定版批打:
我选 一个dwg里带多个图框的,没测试多个dwg文件,这种也可用来转换格式,cad好帮手里也有格式转换,那个也不错,这种批打可以用来真正打图。
好了,下面开始演示,
第一步,选图框是闭合内外框,多段线,不要选直线,原因是直线刷新图框时会很慢,且一般我们用的图框就是多段线,
第二步,选闭合框所在的图层,比如我的图框所在图层是0,这一点,作者应当把图层列出来,不要让用户去填,我向他提吧,
第三步,点刷新图框
第四步,点确认
总结:效果不错,建议如下:1、闭合框图层多个按钮让用户去点图框图元,不要用户去填
2、刷新图框后,应当让用户知道,是不是他要的图框,比如我这图中,我只想要里面那个框范围呢?所以,我建议作者让用户直接点图框图元(得支持框选)

演示文件下载点这里:ys

有群友说用gif录教程就行,结果录出来一看,好几十M,下次还是用screen2exe,这是录屏神器。

发表在 CAD好帮手教程 | 标签为 | 留下评论

使用ilmerge实现.net程序静态链接

当编写规模稍大一点的程序时,需要进行模块划分。我们一般是对每个模块建一个工程,输出一个类库,这样就形成了一个exe加多个类库的解放方案。这样本身是没有什么问题的,就是发布上稍微有点麻烦,需要发布一个exe加多个dll文件。特别是那些需要经常更新的程序,其实本身可能并不大,一共也就几百kb,但每次还要发布三四个dll确实令人厌烦,做成安装包就更没必要了。

在C++中,我们一般可以通过静态链接解决这种问题,但在.net中却不行,每个类库只能输出dll,VisualStudio官方也没有提供静态链接的选项,其实从理论上讲要想合并似乎也不难,ildasm能够把.NET程序反编译成il,那么把两个il合并到一个il当中再用il编译就可以了。虽然M$却没有直接提供这种功能,但M$的一位大牛提供了一个工具ILMerge可以实现这种功能,可以在http://research.microsoft.com/~mbarnett/ILMerge.aspx下载。

网上也有一些文章对这个工具进行了介绍,margiex的blog中的说明就介绍的较简明扼要,这里转录一下:

ilmerge /ndebug /target:exe /targetplatform:v1.1 /out:newclient.exe oldclient.exe /log AutoUpdater.dll DockingSuite.dll DocumentManager.dll FileHelpers.dll OutlookBar.dll SandBar.dll ICSharpCode.SharpZipLib.dll

解释如下:

  1. target: 指定输出组件的类型,有DLL/EXE/WINEXE; (如果是EXE,则程序在执行的时候将出现一个DOS窗口(即使是WINFORM的程序). 因此应该设置target为winexe)
  2. targetplatform: 输出组件的.net运行版本;
  3. out: 合并后的组件全名;
    后面是主要的被合并的组件名称, 及相关所有的其它DLL;
    上面的示例只是合并为EXE, 也可以多个DLL合并成一个DLL使用, 各自的命名空间不会改变;
  • 不能合并interop这种由COM转换过来的DLL; (可以合并,但相关依赖的DLL必须也一起合并, 第一次合并的时候只有Excel.dll,总是报错,以为是interop的缘故,后来才发现是没有合并vbide.dll的缘故,复制到目录再一起合并,一切OK.)
  • 如果有资源DLL, 应该将要被合并的oldclient.exe先改为别的名称,然后合并后的输出命名为:oldclient.exe,因为资源文件名是:oldclient.resources.dll,而ILMERGE不能合并资源文件,否则在导出后将找不到此资源文件。(如果哪位知道如何合并资源文件,请指教,谢谢)
  • 虽然合并后的EXE比较大,但在用户那里只有一个EXE,这样直观的多,也容易升级维护.

原文地址:http://www.cnblogs.com/margiex/archive/2008/06/24/302329.html

具体的详细使用文档请参看它的说明文档,还是很简单的。

另外,也可以通过编程的方式来调用ILMerge的库来实现简化合并,这里转录一下CodeProject上的一篇文章Post build step static linking tool for C#, using ILMerge的代码:

using System;
using System.Text;
using System.Collections;

namespace HTMerge
{
    class Program
    {   
        static void Main(string[] args)
        {
            try
            {
                String strDir = “”;
                if (args.Length != 1)
                {
                    Console.WriteLine(“Usage: HTMerge directoryName”);
                    return;
                }
                else
                {
                    strDir = args[0];
                }

                String[] exeFiles = System.IO.Directory.GetFiles(strDir, “*.exe”);
                String[] dllFiles = System.IO.Directory.GetFiles(strDir, “*.dll”);

                ArrayList ar = new ArrayList();

                Boolean bAdded = false;

                //there might be more than 1 exe file, 
                //we go for the first one that isn’t the vshost exe
                foreach (String strExe in exeFiles)
                {
                    if (!strExe.Contains(“vshost”))
                    {
                        ar.Add(strExe);
                        bAdded = true;
                        break;
                    }
                }

                if (!bAdded)
                {
                    Console.WriteLine(“Error: No exe could be found”);
                    //I know multiple returns are bad�
                    return;
                }

                bAdded = false;

                foreach (String strDLL in dllFiles)
                {
                    ar.Add(strDLL);
                    bAdded = true;
                }

                //no point merging if nothing to merge with!
                if (!bAdded)
                {
                    Console.WriteLine(“Error: No DLLs could be found”);
                    //I know multiple returns are bad�
                    return;
                }

                //You will need to add a reference to ILMerge.exe from Microsoft
                //See http://research.microsoft.com/~mbarnett/ILMerge.aspx
                ILMerging.ILMerge myMerge = new ILMerging.ILMerge();

                String[] files = (String[])ar.ToArray(typeof(string));

                String strTargetDir = strDir + “\\Merged”;

                try
                {
                    System.IO.Directory.CreateDirectory(strTargetDir);
                }
                catch
                {
                }

                //Here we get the first file name 
                //(which was the .exe file) and use that
                // as the output
                String strOutputFile = System.IO.Path.GetFileName(files[0]);

                myMerge.OutputFile = strTargetDir + “\\” + strOutputFile;
                myMerge.SetInputAssemblies(files);

                myMerge.Merge();
            }
            catch (Exception ex)
            {
                Console.WriteLine(String.Format(“Error :{0}”,ex.Message));
            }

        }
    }
}

发表在 C# | 标签为 , | 留下评论

cad炸开的表格转到excel中

群内有兄弟需要把cad里的表格转到ecxel里,一般的软件转换效果不咋的,虽然cad好帮手里有,但对炸开的表格也无能为力,今天为大家演示一下一个cad外挂插件,叫magictable,本来想演示一下,结果提示过期了,花了点时间,和谐了一下,能用到2016年前,有条件的兄弟还是支持一下作者吧,50元也不是很贵,也期待cad好帮手作者如果也能加个这样的功能,软件大家百度找一下,安装好magictable后,在cad里输入mtb,再按o,把参数设定好,然后框选,就行了,简单吧,演示文件点这里下载:magic table teach

发表在 CAD实用软件 | 标签为 | 留下评论

C#获取当前应用程序所在路径及环境变量

转载:http://www.cnblogs.com/netlyf/archive/2011/06/22/2086718.html

一、获取当前文件的路径

string str1=Process.GetCurrentProcess().MainModule.FileName;//可获得当前执行的exe的文件名。
string str2=Environment.CurrentDirectory;//获取和设置当前目录(即该进程从中启动的目录)的完全限定路径。(备注:按照定义,如果该进程在本地或网络驱动器的根目录中启动,则此属性的值为驱动器名称后跟一个尾部反斜杠(如“C:\”)。如果该进程在子目录中启动,则此属性的值为不带尾部反斜杠的驱动器和子目录路径[如“C:\mySubDirectory”])。
string str3=Directory.GetCurrentDirectory(); //获取应用程序的当前工作目录。
string str4=AppDomain.CurrentDomain.BaseDirectory;//获取基目录,它由程序集冲突解决程序用来探测程序集。
string str5=Application.StartupPath;//获取启动了应用程序的可执行文件的路径,不包括可执行文件的名称。
string str6=Application.ExecutablePath;//获取启动了应用程序的可执行文件的路径,包括可执行文件的名称。
string str7=AppDomain.CurrentDomain.SetupInformation.ApplicationBase;//获取或设置包含该应用程序的目录的名称。

1. System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName
   获取模块的完整路径。
2. System.Environment.CurrentDirectory
   获取和设置当前目录(该进程从中启动的目录)的完全限定目录。
3. System.IO.Directory.GetCurrentDirectory()
   获取应用程序的当前工作目录。这个不一定是程序从中启动的目录啊,有可能程序放在C:\www里,这个函数有可能返回C:\Documents and Settings\ZYB\,或者C:\Program Files\Adobe\,有时不一定返回什么东东,这是任何应用程序最后一次操作过的目录,比如你用Word打开了E:\doc\my.doc这个文件,此时执行这个方法就返回了E:\doc了。
4. System.AppDomain.CurrentDomain.BaseDirectory
   获取程序的基目录。
5. System.Windows.Forms.Application.StartupPath
   获取启动了应用程序的可执行文件的路径。效果和2、5一样。只是5返回的字符串后面多了一个”\”而已。
6. System.Windows.Forms.Application.ExecutablePath
   获取启动了应用程序的可执行文件的路径及文件名,效果和1一样。
7. System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
   获取和设置包括该应用程序的目录的名称。

二、操作环境变量

利用System.Environment.GetEnvironmentVariable()方法可以很方便地取得系统环境变量,如:System.Environment.GetEnvironmentVariable(“windir”)就可以取得windows系统目录的路径。
以下是一些常用的环境变量取值:
System.Environment.GetEnvironmentVariable(“windir”);
System.Environment.GetEnvironmentVariable(“INCLUDE”);
System.Environment.GetEnvironmentVariable(“TMP”);
System.Environment.GetEnvironmentVariable(“TEMP”);
System.Environment.GetEnvironmentVariable(“Path”);

三、应用实例

编写了一个WinForm程序,项目文件存放于D:\Projects\Demo,编译后的文件位于D:\Projects\Demo\bin\Debug,最后的结果如下:

1、System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName=D:\Projects\Demo\bin\Debug\Demo.vshost.exe
2、System.Environment.CurrentDirectory=D:\Projects\Demo\bin\Debug
3、System.IO.Directory.GetCurrentDirectory()=D:\Projects\Demo\bin\Debug
4、System.AppDomain.CurrentDomain.BaseDirectory=D:\Projects\Demo\bin\Debug\
5、System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase=D:\Projects\Demo\bin\Debug\
6、System.Windows.Forms.Application.StartupPath=D:\Projects\Demo\bin\Debug
7、System.Windows.Forms.Application.ExecutablePath=D:\Projects\Demo\bin\Debug\Demo.EXE

System.Environment.GetEnvironmentVariable(“windir”)=C:\WINDOWS
System.Environment.GetEnvironmentVariable(“INCLUDE”)=C:\Program Files\Microsoft Visual Studio.NET 2005\SDK\v2.0\include\
System.Environment.GetEnvironmentVariable(“TMP”)=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
System.Environment.GetEnvironmentVariable(“TEMP”)=C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp
System.Environment.GetEnvironmentVariable(“Path”)=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\Program Files\Microsoft SQL Server\90\Tools\binn\

发表在 C# | 标签为 | 留下评论

定制你的cad好帮手,让常用的显示,不常用的隐藏

自从有了cad好帮手,工作起来一些小问题都能解决了,有些功能我们可能一下子用不到,有些功能确经常使用,所以,cad好帮手作者,为我们想到了,下面给大家演示一下,如何显示常用的命令,隐藏不常用的命令,现也不用为找不到命令发愁了,新版本马上会发布,请大家到时到网站上更新或加群去更新,cad好帮手群号:315260773。我用的screen2exe录制的,所以下载下来是个exe文件,能播放的,不要担心是病毒,演示下载:cad teach demo

如果想要改回来,记得用systemconfig命令,配合我以前的教程,可以定制属于你个人的cad好帮手了(可添加你的个人常用程序)不记得教程地址了?我传送给你:http://www.cadgj.com/?p=1414

发表在 CAD好帮手教程 | 标签为 | 留下评论

标注属性比较

在涉及到标注相关开发的时候

部分情况下可能不清楚具体那个属性是由哪个参数控制的

有了下面的比较代码

问题迎刃而解

拷贝一个相同的标注,然后修改你需要控制的属性,然后比较一下,问题立马解决了。

//—————————————————————————–

//—– acrxEntryPoint.h

//—————————————————————————–

#include “StdAfx.h”

#include “resource.h”

 

//—————————————————————————–

#define szRDS _RXST(“”)

// 功能:将选择集转换为实体ID数组

// 参数: ObjIds,实体ID数组

// ssName,选择集

// 返回:

void SSToIds(AcDbObjectIdArray& ObjIds,ads_name ssName)

{

AcDbObjectId ObjId;

ads_name EntName;

long nLength=0;

acedSSLength(ssName,&nLength);

 

for(int nLen=0; nLen<nLength;nLen++)

{

acedSSName(ssName,nLen,EntName);

acdbGetObjectId(ObjId,EntName);

ObjIds.append(ObjId);

}

}

// 把AcDb::lineWeight类型的值转换成字符串

CString LnWeightToString(AcDb::LineWeight type)

{

if (type == AcDb::kLnWt000) return _T(“kLnWt000”);

else if (type == AcDb::kLnWt005) return _T(“kLnWt005”);

else if (type == AcDb::kLnWt009) return _T(“kLnWt009”);

else if (type == AcDb::kLnWt013) return _T(“kLnWt013”);

else if (type == AcDb::kLnWt015) return _T(“kLnWt015”);

else if (type == AcDb::kLnWt018) return _T(“kLnWt018”);

else if (type == AcDb::kLnWt020) return _T(“kLnWt020”);

else if (type == AcDb::kLnWt025) return _T(“kLnWt025”);

else if (type == AcDb::kLnWt030) return _T(“kLnWt030”);

else if (type == AcDb::kLnWt035) return _T(“kLnWt035”);

else if (type == AcDb::kLnWt040) return _T(“kLnWt040”);

else if (type == AcDb::kLnWt050) return _T(“kLnWt050”);

else if (type == AcDb::kLnWt053) return _T(“kLnWt053”);

else if (type == AcDb::kLnWt060) return _T(“kLnWt060”);

else if (type == AcDb::kLnWt070) return _T(“kLnWt070”);

else if (type == AcDb::kLnWt080) return _T(“kLnWt080”);

else if (type == AcDb::kLnWt090) return _T(“kLnWt090”);

else if (type == AcDb::kLnWt100) return _T(“kLnWt100”);

else if (type == AcDb::kLnWt106) return _T(“kLnWt106”);

else if (type == AcDb::kLnWt120) return _T(“kLnWt120”);

else if (type == AcDb::kLnWt140) return _T(“kLnWt140”);

else if (type == AcDb::kLnWt158) return _T(“kLnWt158”);

else if (type == AcDb::kLnWt200) return _T(“kLnWt200”);

else if (type == AcDb::kLnWt211) return _T(“kLnWt211”);

else if (type == AcDb::kLnWtByLayer) return _T(“kLnWtByLayer”);

else if (type == AcDb::kLnWtByBlock) return _T(“kLnWtByBlock”);

else if (type == AcDb::kLnWtByLwDefault) return _T(“kLnWtByLwDefault”);

else return _T(“kUnknown”);

}

//属性

struct GProperty

{

CString strName;

CString strValue;

GProperty()

{

 

}

~GProperty()

{

}

GProperty(const GProperty& prop)

{

strName=prop.strName;

strValue=prop.strValue;

}

GProperty& operator=(const GProperty& prop)

{

if(this==&prop)

return *this;

strName=prop.strName;

strValue=prop.strValue;

return *this;

}

GProperty(CString name,CString value)

{

strName=name;

strValue=_T(“string:”)+value;

}

GProperty(CString name,bool value)

{

strName=name;

strValue=value?_T(“bool:true”):_T(“bool:false”);

}

GProperty(CString name,int value)

{

strName=name;

strValue.Format(_T(“int:%d”),value);

}

GProperty(CString name,double value)

{

strName=name;

strValue.Format(_T(“double:%f”),value);

}

GProperty(CString name,TCHAR value)

{

strName=name;

strValue.Format(_T(“char:%c”),value);

}

GProperty(CString name,AcCmColor value)

{

strName=name;

strValue.Format(_T(“COLOR:RGB(%d,%d,%d)”),value.red(),value.green(),value.blue());

}

GProperty(CString name,AcDbObjectId value)

{

strName=name;

if(!value.isValid())

{

strValue=_T(“AcDbObjectId:kNull”);

}

else

{

TCHAR tmpStr[256]={0};

value.handle().getIntoAsciiBuffer(tmpStr);

strValue=_T(“AcDbObjectId:”);

strValue+=tmpStr;

}

}

GProperty(CString name,AcDb::LineWeight value)

{

strName=name;

strValue=_T(“LineWeight:”);

strValue+=LnWeightToString(value);

}

};

struct GPropertyList

{

CArray<GProperty> m_propList;

GPropertyList()

{

}

GPropertyList(const GPropertyList& src)

{

m_propList.RemoveAll();

m_propList.Append(src.m_propList);

}

GPropertyList& operator=(const GPropertyList& src)

{

if(this==&src)

{

return *this;

}

m_propList.RemoveAll();

m_propList.Append(src.m_propList);

return *this;

}

int Add(GProperty prop)

{

for(int i=0;i<m_propList.GetCount();i++)

{

GProperty& tmp=m_propList.GetAt(i);

if(tmp.strName.CompareNoCase(prop.strName)==0)

{

m_propList.SetAt(i,prop);

return i;

}

}

return m_propList.Add(prop);

}

void Diff(GPropertyList& diff)

{

for(int i=0;i<m_propList.GetCount();i++)

{

bool bFind=false;

for(int j=0;j<diff.m_propList.GetCount();j++)

{

if(m_propList.GetAt(i).strName.CompareNoCase(diff.m_propList.GetAt(j).strName)==0)

{

bFind=true;

if(m_propList.GetAt(i).strValue.CompareNoCase(diff.m_propList.GetAt(j).strValue)!=0)

{

acutPrintf(_T(“\n 修改属性[%s]值[%s]为新值[%s]”),m_propList.GetAt(i).strName,m_propList.GetAt(i).strValue,diff.m_propList.GetAt(j).strValue);

}

break;

}

}

if(bFind)

{

continue;

}

acutPrintf(_T(“\n 删除属性[%s]值[%s]”),m_propList.GetAt(i).strName,m_propList.GetAt(i).strValue);

}

 

for(int i=0;i<diff.m_propList.GetCount();i++)

{

bool bFind=false;

for(int j=0;j<m_propList.GetCount();j++)

{

if(diff.m_propList.GetAt(i).strName.CompareNoCase(m_propList.GetAt(j).strName)==0)

{

bFind=true;

break;

}

}

if(bFind)

{

continue;

}

acutPrintf(_T(“\n 新增属性[%s]值[%s]”),diff.m_propList.GetAt(i).strName,diff.m_propList.GetAt(i).strValue);

}

}

 

};

GPropertyList Glb_LastPropertyList;

//读取标注的属性

void ReadDimAttr(GPropertyList& list,AcDbDimension* pDim)

{

list.Add(GProperty(_T(“dimadec”),pDim->dimadec()));

list.Add(GProperty(_T(“dimalt”),pDim->dimalt()));

list.Add(GProperty(_T(“dimaltd”),pDim->dimaltd()));

list.Add(GProperty(_T(“dimaltf”),pDim->dimaltf()));

list.Add(GProperty(_T(“dimaltrnd”),pDim->dimaltrnd()));

list.Add(GProperty(_T(“dimalttd”),pDim->dimalttd()));

list.Add(GProperty(_T(“dimalttz”),pDim->dimalttz()));

list.Add(GProperty(_T(“dimaltu”),pDim->dimaltu()));

list.Add(GProperty(_T(“dimaltz”),pDim->dimaltz()));

list.Add(GProperty(_T(“dimapost”),pDim->dimapost()));

list.Add(GProperty(_T(“dimarcsym”),pDim->dimarcsym()));

list.Add(GProperty(_T(“dimasz”),pDim->dimasz()));

 

list.Add(GProperty(_T(“dimatfit”),pDim->dimatfit()));

list.Add(GProperty(_T(“dimaunit”),pDim->dimaunit()));

list.Add(GProperty(_T(“dimazin”),pDim->dimazin()));

list.Add(GProperty(_T(“dimblk”),pDim->dimblk()));

list.Add(GProperty(_T(“dimblk1”),pDim->dimblk1()));

list.Add(GProperty(_T(“dimblk2”),pDim->dimblk2()));

list.Add(GProperty(_T(“dimcen”),pDim->dimcen()));

list.Add(GProperty(_T(“dimclrd”),pDim->dimclrd()));

list.Add(GProperty(_T(“dimclre”),pDim->dimclre()));

list.Add(GProperty(_T(“dimclrt”),pDim->dimclrt()));

list.Add(GProperty(_T(“dimdec”),pDim->dimdec()));

list.Add(GProperty(_T(“dimdle”),pDim->dimdle()));

 

list.Add(GProperty(_T(“dimdli”),pDim->dimdli()));

list.Add(GProperty(_T(“dimdsep”),pDim->dimdsep()));

list.Add(GProperty(_T(“dimexe”),pDim->dimexe()));

list.Add(GProperty(_T(“dimexo”),pDim->dimexo()));

list.Add(GProperty(_T(“dimfrac”),pDim->dimfrac()));

list.Add(GProperty(_T(“dimgap”),pDim->dimgap()));

list.Add(GProperty(_T(“dimjogang”),pDim->dimjogang()));

list.Add(GProperty(_T(“dimjust”),pDim->dimjust()));

list.Add(GProperty(_T(“dimldrblk”),pDim->dimldrblk()));

list.Add(GProperty(_T(“dimlfac”),pDim->dimlfac()));

list.Add(GProperty(_T(“dimlim”),pDim->dimlim()));

list.Add(GProperty(_T(“dimltex1”),pDim->dimltex1()));

 

list.Add(GProperty(_T(“dimltex2”),pDim->dimltex2()));

list.Add(GProperty(_T(“dimltype”),pDim->dimltype()));

list.Add(GProperty(_T(“dimlunit”),pDim->dimlunit()));

list.Add(GProperty(_T(“dimlwd”),pDim->dimlwd()));

list.Add(GProperty(_T(“dimlwe”),pDim->dimlwe()));

list.Add(GProperty(_T(“dimpost”),pDim->dimpost()));

list.Add(GProperty(_T(“dimrnd”),pDim->dimrnd()));

list.Add(GProperty(_T(“dimsah”),pDim->dimsah()));

list.Add(GProperty(_T(“dimscale”),pDim->dimscale()));

list.Add(GProperty(_T(“dimsd1”),pDim->dimsd1()));

list.Add(GProperty(_T(“dimsd2”),pDim->dimsd2()));

list.Add(GProperty(_T(“dimse1”),pDim->dimse1()));

 

list.Add(GProperty(_T(“dimse2”),pDim->dimse2()));

list.Add(GProperty(_T(“dimsoxd”),pDim->dimsoxd()));

list.Add(GProperty(_T(“dimtad”),pDim->dimtad()));

list.Add(GProperty(_T(“dimtdec”),pDim->dimtdec()));

list.Add(GProperty(_T(“dimtfac”),pDim->dimtfac()));

list.Add(GProperty(_T(“dimtfill”),pDim->dimtfill()));

list.Add(GProperty(_T(“dimtfillclr”),pDim->dimtfillclr()));

list.Add(GProperty(_T(“dimtih”),pDim->dimtih()));

list.Add(GProperty(_T(“dimtix”),pDim->dimtix()));

list.Add(GProperty(_T(“dimtm”),pDim->dimtm()));

list.Add(GProperty(_T(“dimtmove”),pDim->dimtmove()));

list.Add(GProperty(_T(“dimtofl”),pDim->dimtofl()));

 

list.Add(GProperty(_T(“dimtoh”),pDim->dimtoh()));

list.Add(GProperty(_T(“dimtol”),pDim->dimtol()));

list.Add(GProperty(_T(“dimtolj”),pDim->dimtolj()));

list.Add(GProperty(_T(“dimtp”),pDim->dimtp()));

list.Add(GProperty(_T(“dimtsz”),pDim->dimtsz()));

list.Add(GProperty(_T(“dimtvp”),pDim->dimtvp()));

list.Add(GProperty(_T(“dimtxsty”),pDim->dimtxsty()));

list.Add(GProperty(_T(“dimtxt”),pDim->dimtxt()));

list.Add(GProperty(_T(“dimtzin”),pDim->dimtzin()));

list.Add(GProperty(_T(“dimupt”),pDim->dimupt()));

list.Add(GProperty(_T(“dimzin”),pDim->dimzin()));

list.Add(GProperty(_T(“dimfxlenOn”),pDim->dimfxlenOn()));

list.Add(GProperty(_T(“dimfxlen”),pDim->dimfxlen()));

}

void DimAttr()

{

AcDbObjectIdArray ids;

ads_name ssName;

resbuf* rb = acutBuildList(RTDXF0, _T(“DIMENSION”), 0);

TCHAR* promptPtrs[2]={_T(“\n选择原始标注:”),_T(“\n移除原始标注:”)};

int rc=acedSSGet(_T(“:S:$”), promptPtrs,NULL,rb,ssName);

if(rc!=RTNORM)

{

acutRelRb(rb);

return;

}

acutRelRb(rb);

SSToIds(ids,ssName);

acedSSFree(ssName);

if(ids.logicalLength()!=1)

{

return;

}

AcDbEntityPointer spEnt(ids.at(0),AcDb::kForRead);

if(spEnt.openStatus()!=Acad::eOk)

{

return;

}

if(!spEnt->isKindOf(AcDbDimension::desc()))

{

return;

}

AcDbDimension* pDim=AcDbDimension::cast(spEnt.object());

GPropertyList list;

ReadDimAttr(list,pDim);

 

AcDbObjectIdArray ids1;

ads_name ssName1;

resbuf* rb1 = acutBuildList(RTDXF0, _T(“DIMENSION”), 0);

TCHAR* promptPtrs1[2]={_T(“\n选择修改后的标注:”),_T(“\n移除修改后的标注:”)};

int rc1=acedSSGet(_T(“:S:$”), promptPtrs1,NULL,rb1,ssName1);

if(rc1!=RTNORM)

{

acutRelRb(rb1);

return;

}

acutRelRb(rb1);

SSToIds(ids1,ssName1);

acedSSFree(ssName1);

if(ids1.logicalLength()!=1)

{

return;

}

AcDbEntityPointer spEnt1(ids1.at(0),AcDb::kForRead);

if(spEnt1.openStatus()!=Acad::eOk)

{

return;

}

if(!spEnt1->isKindOf(AcDbDimension::desc()))

{

return;

}

AcDbDimension* pDim1=AcDbDimension::cast(spEnt1.object());

GPropertyList list1;

ReadDimAttr(list1,pDim1);

 

list.Diff(list1);

}

//—————————————————————————–

//—– ObjectARX EntryPoint

class CDimAttrApp : public AcRxArxApp {

 

public:

CDimAttrApp () : AcRxArxApp () {}

 

virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {

// TODO: Load dependencies here

 

// You *must* call On_kInitAppMsg here

AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;

acedRegCmds->addCommand(_T(“DimAttrApp”),

_T(“DimAttr”),

_T(“DimAttr”),

0,

DimAttr);

 

// TODO: Add your initialization code here

 

return (retCode) ;

}

 

virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {

// TODO: Add your code here

 

// You *must* call On_kUnloadAppMsg here

AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

 

// TODO: Unload dependencies here

acedRegCmds->removeGroup(_T(“DimAttrApp”));

 

return (retCode) ;

}

 

virtual void RegisterServerComponents () {

}

 

} ;

 

//—————————————————————————–

IMPLEMENT_ARX_ENTRYPOINT(CDimAttrApp)

发表在 ObjectArx | 留下评论

新版cad好帮手去教育版,兼容天正、理正等一系列自定义cad图元,不丢东西

还得记我发的不用转换格式,用cad本身去教育版么,不记得请看这里,http://www.cadgj.com/?p=1310

看完后,是不是觉得这样手动改教育版很麻烦,而且还有一点是,这样去掉后的教育版图形中的图层名称会多一些乱七八糟的符号,得自己动手一个一个的改图层名称,现在,cad好帮手的开发者已为我们完美解决这个教育版问题了,大家觉得有用的,可去下最新版cad好帮手,下面,我为大家演示一下cad好帮手强大的去教育版功能:

发表在 CAD好帮手教程 | 标签为 | 留下评论

C#中读取cad文件中的属性

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;

Database db = new Database(false, true);
try
{
//把DWG文件读入到一个临时的内存数据库中
db.ReadDwgFile(fullFileName, System.IO.FileShare.ReadWrite, true, null);
//现在进入数据库并获得数据库的块表引用
BlockTable bt = (BlockTable)trans.GetObject(db.BlockTableId, OpenMode.ForRead, false, true);
//从块表的模型空间特性中获得块表记录,块表记录对象包含DWG文件数据库实体
BlockTableRecord btr = (BlockTableRecord)trans.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false, true);
foreach (ObjectId btrId in btr)
{
DBObject entBlock = (DBObject)trans.GetObject(btrId, OpenMode.ForRead, false, true);
if (entBlock.GetRXClass().DxfName.ToUpper() == “INSERT”)
{
BlockReference bRef = (BlockReference)entBlock;
if (bRef.AttributeCollection.Count != 0)
{
System.Collections.IEnumerator bRefEnum = bRef.AttributeCollection.GetEnumerator();
while (bRefEnum.MoveNext())
{
ObjectId aId = (ObjectId)bRefEnum.Current;//这一句极其关键
AttributeReference aRef = (AttributeReference)trans.GetObject(aId, OpenMode.ForRead, false, true);
aRef.TextString;//此语句即获得属性单行文本,请自行在此语句前添加 属性单行文本 赋于的变量
}
}
}
}
trans.Commit(); //提交事务处理
btr.Dispose();
bt.Dispose();
}
catch (System.Exception ex)
{
MessageBox.Show(“\n出错啦: ” + ex.Message);
}
finally
{
db.Dispose();
}

发表在 C# | 2条评论

C# 读取CAD文件缩略图(DWG文件)

转载:http://blog.163.com/kingchane_001/blog/static/107682120108443458261/

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace 浏览dwg
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
ViewDWG viewDwg = new ViewDWG();
pictureBox1.Image = viewDwg.GetDwgImage(“c:\\1.dwg”);
}
class ViewDWG
{
struct BITMAPFILEHEADER
{
public short bfType;
public int bfSize;
public short bfReserved1;
public short bfReserved2;
public int bfOffBits;
}
public Image GetDwgImage(string FileName)
{
if (!(File.Exists(FileName)))
{
throw new FileNotFoundException(“文件没有被找到”);
}
FileStream DwgF; //文件流
int PosSentinel; //文件描述块的位置
BinaryReader br; //读取二进制文件
int TypePreview; //缩略图格式
int PosBMP;       //缩略图位置
int LenBMP;       //缩略图大小
short biBitCount; //缩略图比特深度
BITMAPFILEHEADER biH; //BMP文件头,DWG文件中不包含位图文件头,要自行加上去
byte[] BMPInfo;       //包含在DWG文件中的BMP文件体
MemoryStream BMPF = new MemoryStream(); //保存位图的内存文件流
BinaryWriter bmpr = new BinaryWriter(BMPF); //写二进制文件类
Image myImg = null;
try
{
DwgF = new FileStream(FileName, FileMode.Open, FileAccess.Read);   //文件流
br = new BinaryReader(DwgF);
DwgF.Seek(13, SeekOrigin.Begin); //从第十三字节开始读取
PosSentinel = br.ReadInt32(); //第13到17字节指示缩略图描述块的位置
DwgF.Seek(PosSentinel + 30, SeekOrigin.Begin); //将指针移到缩略图描述块的第31字节
TypePreview = br.ReadByte(); //第31字节为缩略图格式信息,2 为BMP格式,3为WMF格式
if (TypePreview == 1)
{
}
else if (TypePreview == 2 || TypePreview == 3)
{
PosBMP = br.ReadInt32(); //DWG文件保存的位图所在位置
LenBMP = br.ReadInt32(); //位图的大小
DwgF.Seek(PosBMP + 14, SeekOrigin.Begin); //移动指针到位图块
biBitCount = br.ReadInt16(); //读取比特深度
DwgF.Seek(PosBMP, SeekOrigin.Begin); //从位图块开始处读取全部位图内容备用
BMPInfo = br.ReadBytes(LenBMP); //不包含文件头的位图信息
br.Close();
DwgF.Close();
biH.bfType = 19778; //建立位图文件头
if (biBitCount < 9)
{
biH.bfSize = 54 + 4 * (int)(Math.Pow(2, biBitCount)) + LenBMP;
}
else
{
biH.bfSize = 54 + LenBMP;
}
biH.bfReserved1 = 0; //保留字节
biH.bfReserved2 = 0; //保留字节
biH.bfOffBits = 14 + 40 + 1024; //图像数据偏移
//以下开始写入位图文件头
bmpr.Write(biH.bfType); //文件类型
bmpr.Write(biH.bfSize); //文件大小
bmpr.Write(biH.bfReserved1); //0
bmpr.Write(biH.bfReserved2); //0
bmpr.Write(biH.bfOffBits); //图像数据偏移
bmpr.Write(BMPInfo); //写入位图
BMPF.Seek(0, SeekOrigin.Begin); //指针移到文件开始处
myImg = Image.FromStream(BMPF); //创建位图文件对象
bmpr.Close();
BMPF.Close();
}
return myImg;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}

}
}

发表在 C# | 留下评论

用cad好帮手快速标注楼层

我做建筑的,平时画立面与剖面时,需要标注楼层,手动一个一个标,很麻烦,现在cad好帮手中的文字递增为我省了很多手工活。如果觉得cad好帮手这个功能是大家喜欢的,我还会建议作者支持数字大写,比如十二,十三这样的数字,以前教程是图文方式,可能不直观,特意为大家录制了视频,演示如下:

发表在 CAD好帮手教程 | 标签为 | 留下评论

带个颜色框的按钮

效果图

//GColorButton.h

#pragma once

class GColorButton:public CButton

{

DECLARE_DYNAMIC(GColorButton)

public:

GColorButton(void);

public:

~GColorButton(void);

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);  COLORREF GetFillColor(){return m_FillColor;}//获取填充框颜色

void SetFillColor(const COLORREF color){m_FillColor=color;}//设置填充框颜色

private:

COLORREF m_FillColor;//填充框颜色

};

//GColorButton.cpp

#include “StdAfx.h”

#include “GColorButton.h”

IMPLEMENT_DYNAMIC(GColorButton, CGridCell) GColorButton::GColorButton(void)

{

m_FillColor=RGB(255,0,0);

}

GColorButton::~GColorButton(void)

{

}

void GColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)

{

UINT uStyle = DFCS_BUTTONPUSH;

// If drawing selected, add the pushed style to DrawFrameControl.

if (lpDIS->itemState & ODS_SELECTED)

uStyle |= DFCS_PUSHED;

// Draw the button frame.

::DrawFrameControl(lpDIS->hDC, &lpDIS->rcItem,       DFC_BUTTON, uStyle);

RECT rc=lpDIS->rcItem;

int nHeight=abs(rc.top-rc.bottom);

int nWidth=abs(rc.right-rc.left);

nHeight/=4;

RECT rc1=rc;

rc1.left+=nHeight;

rc1.right=rc1.left+3*nHeight;

rc1.top=rc.top+nHeight;

rc1.bottom=rc.bottom-nHeight;

lpDIS->rcItem.left+=nHeight*4;  // Get the button’s text.

CString strText;

GetWindowText(strText);

::DrawText(lpDIS->hDC, strText, strText.GetLength(),       &lpDIS->rcItem, DT_SINGLELINE|DT_VCENTER|DT_CENTER);

::FillRect(lpDIS->hDC,&rc1,CreateSolidBrush(m_FillColor));

}

 

特别注意,一定要在资源编辑时将按钮设置为OwnerDrw

表示自己绘制按钮

发表在 C++ | 留下评论

max三维立面转换成cad平面图

有朋友说,用sketchup也能三维导二维图,也是一种方法

这个技巧来源于cad字转线型,字转线型也可用这种办法,cad好帮手里也用了这种处理方法,稳定版出来后,大家就可用上它的字转线型了,比网上的工具效果要好很多,到时看能不能建议好帮手作者开发三维转二维这个功能,难度不大,确省事,让cad直接出二维图,方便大家用!!

第一步,用3dmax打开模型图,把模型清理好,去除你不要的物体,把模型解组

第二步,3dsmax导出dwg


第三步,用cad打开导出的dwg,添加dxb打印机

第五步,切换你要的视图,输出dxb文件格式,ctr+p,用dxb打印

最后,新建dwg,输入dxb二进制文件 over

 

选择的物体都是直线,效果嘛,还行!!

发表在 CAD技巧 | 留下评论

dimblk取值

“” 实心闭合
“_DOT” 点
“_DOTSMALL” 小点
“_DOTBLANK” 空心点
“_ORIGIN” 指示原点
“_ORIGIN2” 指示原点 2
“_OPEN” 打开
“_OPEN90” 直角
“_OPEN30” 30 度角
“_CLOSED” 闭合
“_SMALL” 空心小点
“_NONE” 无
“_OBLIQUE” 倾斜
“_BOXFILLED” 填充框
“_BOXBLANK” 框
“_CLOSEDBLANK” 空心闭合
“_DATUMFILLED” 实心基准三角形
“_DATUMBLANK” 基准三角形
“_INTEGRAL” 完整标记
“_ARCHTICK” 建筑标记

 

取值同样适用于dimblk1和dimblk2

发表在 ObjectArx | 留下评论

autolisp 函数

一、数学运算功能函数

1.l(十  数值 数值…)返回:累计实数或整数数值

1.2(一  数值 数值…)返回:差值

1.3(*  数值 数值…)返回:所有数值乘积

1.4(/  数值 数值…)返回:第一个数值除以第二个以后数值的商

1.5(l十 数值)返回:数值十l

l. 6(1— 数值)返回:数值一l

l.7(abs 数值)返回:数值的绝对值

1.8(atan 数值)返回:反正切值

1.9(cos 角度)返回:角度的余弦值,角度值为弧度

1.10(exp 数值)返回:数值的指数

1.11(expt  底数指数)返回:底数的指数值

1.12(fix 数值)返回:将数值转换为整数值

1.14(gcd  数值1 数值2)返回:两数值的最大公因数

1.15(log 数值)返回:数值的自然对数值

1.16(max 数值 数值…)返回:数值中的最大值

1.17(min 数值 数值…)返回:数值中的最小值

1.18 pi              常数∏,其值约为3.1415926

1.19(rem 数值   1数值  2)返回:M数值的相除的余数

l.20(sin 角度)返回:角度的正旋值,角度值为弧度

1.21(sqrt 数值)返回:数值的平方根

二、检验与逻辑运算功能函数

2.l(=  表达式1  表达式2)比较表达式1是否等于式2,适用数值及字符串

2.2 (/=  表达式1  表达式2)比较表达式1是否大于等于表达式2

2.3(<  表达式1  表达式2)    比较表达式1是否<小于表达式2

2.4(<=  表达式1  表达式2)比较表达式1是否<一小于等于表达式2

2.5(>  表达式1  表达式2)    比较表达式1是否>大于表达式2

2.6(>=  表达式1  表达式2) 比较表达式1是否大于等于表达式2

2.7 (~  数值)返回:数值的位 not值,(1的补码)

2.8 (and  表达式1  表达式2…)返回:逻辑and的结果

2.9(boole  函数 整数 整数…)返回:位式布尔运算

2.10(eq  表达式1  表达式2)比较表达式1与表达式2是否相同,适用列表比较(实际相同)

2.11(equal  表达式  1表达式 2[差量])比较表达式  1与表达式 2是否相同,差量可省略(内容相同)

三、转换运算功能函数

3.l(angtof  字符串[模式])返回:角度值的字符串转成实数

3.2(angtos  角度[模式[精度]])返回:角度转成的字符串值

3.3(atof  字符串)返回:字符串转成实数值

3.4 (atoi  字符串)返回:字符串转成整数值

3.5 (cvunit  数值 原始单位 转换单位)返回:数值转换单位后的值转换根据acad.nut文件

3.6(distof  字符串 [模式])返回:根据模式将字符串转成实数值

3.7(itoa  整数)返回:整数转成字符串

3.8(rtos  数值 模式[精度])返回:实数转成字符串

3.9 (trans  点 原位置 新位置[位移]) 返回:转换坐标系统值

四、列表处理功能函数

4.1 (append  列表 列表……) 结合所有列表成一个列表

4.2(assoc  关键元素 联合列表)根据关键元素找寻联合列表中关系信息

4.3 (car  列表)返回列表中的第一个元素,通常用来求X坐标

4.4(cadr  列表)返回列表中的第二个元素,通常用来求y坐标

4.5(caddr  列表)返回列表中的第三个元素,通常用来求Z坐标

4.6(cdr  列表)返回:除去第一个元素后的列表

4.7(cons  新元素 列表)返回:将新元素添加到列表

4.8(foreach 名称  列表 表达式)返回:将列表的每一元素对应至名称再根据表达式执行响应

4.9(length  列表)返回:列表内的元素数量

4.10(list  元素 元素…)返回:将所有元素合并为一列表

4.11(listp  元素)返回:判断元素是否为一串

4.12(mapcar函数 列表1列表2…)返回:将列表1、列表2列表的元素配合函数,求得新列表

4.13(member  关键元素列表)返回:根据关键元素(含似后的列表

4.14(nth  n  列表)返回:列表的第n个元素

4.15(reverse  列表)返回:将列表元素根据顺序颠倒过来的列表

4.16(subst  新项旧项列表)返回:替换新旧列表后的列表

五、字符串、字符、文件处理函数

5.l(ascii  字符串)返回:字符串第一个字符的“ASCII”码

5.2 (chr  整数)返回:整数所对应的ASCII单一字符串

5.3(close  文件 名称)关闭文件

5.4(open  文件名 模式)返回:打开文件代码,准备读取或写入信息

5.5(read 字符串)返回:列表中的字符串的第一组元素

5.6(read-char[文件代码])返回:通过键盘或文件中读取单一字符

5.7(read-line [文件代码])返回:经由键盘或文件中读取一行字符串

5.8(strcase  字符串[字样])返回:转换字符串大小写

5.9(strcat  字符串1字符串2…)返回:将各字符串合并为一个字符串

5.10(strlen  字符串)返回:字符串构成的字符数(即字符串长度)

5.11(substr  字符串 起始 长度)返回:取出于字符串‘

5.12(wcmatch  字符串 格式)返回:T或  nil,将字符串与通用字符进行比较

5.13(write-char数值[文件代码])返回:将一ASCII字符写到文件或屏幕

15.14(write-line字符串[文件代码])返回:将字符串写到文件或屏幕上

六、等待输入功能函数

6.l  (getangle [基点] [提示])请求输入十进制角度数值,响应一个弧度值提示及参考点可有可无

6.2(getcorner 基点[提示])请求输入另一矩形框对角点坐标

6.3(getdist [基点][提示])请求输入一段距离

6.4(getint [提示])请求输入一个整数值

6.5(getkword [提示]请求输入“关键词”

6.6(getorient [基点][提示])请求输入十进制角度,响应一弧度值不受angbase、angdir影响

6.7(getPoint [基点][提示])请求输入一个点的坐标

6.8(getreal [提示]请求输入一个实数

6.9(getstring  [提示])请求输入一个字符串

6.10(initget [位]字符串)设定下次getxxx函数的有效输入

七、几何运算功能函数

7.l(angle  点1  点2)取得两点的角度弧度值

7.2(distance  点1  点2)取得两点的距离

7.3(inters  点1   点2   点3  点 4[模式])取得两条线的交点

7.4(osnap  点  模式字符串)按照捕捉模式取得另一坐标点

7.5(polar 基点 弧度 距离)按照极坐标法取得另一坐标点

7.6(textbox  对象列表)取得文字字符串的两个对角点坐标

八、对象处理功能函数

8.l(entdel  对象名称)删除或取消删除对象

8.2(entget  对象名称[应用程序列表])取出对象名称的信息列表

8.3 (entlast)          取出图形信息中的最后一个对象

8.4(entmake  对象列表)建立一个新的对象列表

8.5(entmod  对象列表)根据更新的信息列表更新屏幕上元体

8.6(entnext [对象名称])找寻图面中的下一个对象

8.7(entsel [提示])请求选取一个对象,响应包含对象名称及选点坐标的列表;

8.8(entupd  对象名称)更新屏幕上复元体图形

8.9(handent  图码)返回:图码的元体名称

8.10(nentsel[提示])返回:BLOCK所含副元体对象信息列表

8.11(nentselp [提示][点])返回:BLOCK所含副元体对象信息似4*4矩形表示)

九、选择集、符号表处理函数

9.l(ssadd  [对象名称][选择集])将对象加入选择集或建立一新选择集

9.2(ssdel  对象名称选择集)将对象自选择集中移出

9.3(ssget [模式][点  1][点  2]取得一个选择集

9.4(ssget ”X” [过滤列表])取得根据过滤列表所指定范围的选择集

9.5(sslenth  选择集)计算选择集的对象个数

9.6(ssmemb  对象名称选择集)响应对象名称是否包含于选择集内

9.7(ssname  选择集索引值)根据索引值取出选择集中的对象名称

9.8(tblnext  符号表名称[T])检视符号表,有效的符号表:”LAYER”、”LTYPE”、”VIEW”、

”STYLE”、”BLOCK”

9.9(tblsearch  符号表名称  符号)在符号表中搜寻符号

十 、AutoCAD相关查询、控制功能函数

10.l(command  ”AutoCAD命令”…)超重量级函数,调用执行 AutoCAD命令

10.2(findfile  文件名)返回:该文件名的路径及文件名

10.3(getfiled  标题 内定档名 扩展名 旗号)通过标准  AutoCAD文件对话  DCL对话框获得文件

10.4(getenv  ”环境变量”)取得该环境变量的设定值,以字符串表示

10.5(getvar  ”系统变量”)取得该系统变量的设定值,以字符串表示

10.6(setvar  ”系统变量”值)设定该系统变量的值

10.7(regapp  应用类项)将目前的AutoCAD图形登记为一个应用程序名称

十一、判断式、循环相关功能函数

11.1(If <比较式> <表达式1> [表达式2] 检算比较式结果,如果为真,执行<表达式1>,否则执行<表达式2>

11.2( repeat  次数  [< 表达式> <表达式>…])重复执行 N次表达式

11.3(While <比较式> <表达式>…)  当条件成立则执行表达式内容

11.4(cond  <比较式 1> <表达式 1>        多条件式的  if整合功能

<比较式2> <表达式2>

<比较式3> <表达式3>)

11.5 ( prong  表达式1 表达式2…)  连接其中的表达式为一组,常用于配合if、cond等函数

十二、函数处理、定义、追踪与错误处理功能函数

12.l(*error*  字符串)程序错误时的警示信息

12.2(alert  字符串)以对话框式显示出警告字符串

12.3(apply 功能函数列表)将功能函数与列表结合后执行

12.4(defun  名称  自变量列表表达式_.)自定函数或子程序

12.5(eval 表达式)返回:表达式的执行结果

12.6(exit)强制退出目前的应用程序

12.7(lambda 自变量表达式)定义未命名的函数

12.8(progn  表达式1  表达式2…)连接其内的表达式为一组,常用于配合if、cond等函数

12.9(quit)强制退出目前的应用程序

12.10(tablet 代码 [列1列2列3方向])取用或建立对数字板的校调

12.11(trace 函数…)对函数设定追踪标记,辅助检错

12.12(untrace  函数…)对函数设定解除追踪标记

十三、显示、打印控制功能函数

13.l(gfaphscr)作图环境切换到图形画面

13.2(grclear)暂时清除模前的屏幕画面

13.3(grdraw起点终点颜色[亮显])暂时性的画出一条线

13.4(grread[追踪])由输入设备读取追踪值

13.5(grtext位置字符串[亮显])将字符串显示在状态列或屏幕菜单上

13.6(grvecs向量列表[转置矩阵])暂时性的画出多条线

13.7(menucmd字符串);提供在  AlltOLISP中调用各菜单

13.8(Prinl[表达式[文件代码]]将表达式打印于命令区或已打开的文件句柄字符则以“\”为前缀展开

13.9(pinc[表达式[文件代码]]除句柄字符则不以”\”为前缀展外开其余同Prinl

13.10(print[表达式[文件代码]]除表达式会往下一新行列出,及空一格外其余同prinl

13.11(prompt信息)将信息显示于屏幕的命令区,并随后响应一个nil信息

13.12(redraw[对象名称[模式]])重绘整张图或根据对象名称重绘该图形

13.13(terpri)           在屏幕上显示新列

13.14(textscr)           作图环境切换到文字画面

13.15(textpage)清除文字画面文字类似  DOS的cls命令

13.16(vports)返回:窗口组态列表

十四、符号、元素、表达式处理功能函数

14.l(atom元素)如果元素不是列表,响应T,否则为nil

14.2(atoms-family格式闲号列表])返回:一组己定义函数的符号列表

14.3(boundp表达式)返回:T或 nil,响应表达式是否有值存在

14.4(minusp元素)返回:T或n儿 元素是否为负值

14.5(not元素)返回:T或n儿 判定元素是否为ni1

14.6(null元素)返回:T或nil判定元素是否被赋予nil值

14.7(numberp元素)返回:T或nil,元素是否为整数或实数

14.8(quote表达式)响应表达式未检算前状态,同“‘”功能

14.9(set符号 表达式)将表达式结果设定给带单引号’符号

14.10(setq符号1 表达式1[符号2表达式2]…)设定表达式结果给各符号

14.11(type元素)返回:元素的信息型态

14.12(zerop元素)返回:T或nil,元素是否为0值

十五、ADS、ARX、AutoLISP加载与卸载函数

15.l(ads)返回:目前加载ADS程序列表

15.2(arx)返回:目前加载 ARX程序列表

15.3(arxload应用程序[出错处理]))返回:加载 ARX程序

15.4(arxunload应用程序[出错处理]))返回:卸载 ARX程序

15.5(ver)             返回:目前  AutoLISP版本字符串

15.6(load LSP文件名[加载失败])加载 AutoLISP文件(*.lsp)

15.7 (xload应用程序[错处理])加载ADS应用程序

15.8  (xunloa应用程序[出错处理])卸载 ADS应用程序

十六、内存空间管理函数

16.l(alloc数值)以节点数值设定区段大小

16.2(expand数值)以区段数值配置节点空间

16.3(gc)强制收回废内存

16.4(mem)显示目前的内存使用状态

16.5(xdroom对象名称)返回对象扩展信息允许使用的内存空间

16.6(xdsize列表)返回对象扩展信息所占用的内存空间

十七、其它重要的功能函数

17.l(acad­_colordlg 颜色码 旗号)显示出标准  AutoCAD颜色选择对话框

17.2(acad_helpdlg 求助文件名 主题)显示出标准 AutoCAD求助对话框

17.3(acad_strlsort字符串列表)作字符串列表排序

17.4(bherrs)         取得 bhatch与   bpcly失败所产生的错误信息

17.5(bhatch点[选择集[向量]])根据 Pick point选点方式调用 bhatch命令,绘制选集区域的剖面线

17.6(bpoly点[选择集[向量]])根据Pick point选点方式调用bpoly命令并产生一定域Polyline

17.7(cal计算式字符串)执行如  CAL计算功能

十八、ADS、ARX外部定义的3D函数

18.1(align自变量  1 自变量 2....)执行如  ALIGN命令各选项顺序

18.2(c:3dsin模式3DS文件名)导入3DS文件

18.3(C:3dsout模式3DS文件名)输出3DS文件

18.4(c:background模式[选项])设定渲染背景

18.5(C:fog模式[选项])设定渲染的雾效果

18.6(C:light模式[选项])设定渲染的灯光控制

18.7(c:lsedit模式【选项1】设定渲染的景物控制

18.8(C:lslib模式[选项])管理景物图库

18.9(c:matilb模式 材质 材质库名)管理材质数据库

18.10(c:mirror3d 自变量1 自变量2……) 执行如MIRROR3D命令

18.11(C:psdrap模式)根据模式设定值(0或1),传唤psdrap命令

18.12(C:psfill对象名称  图案名称[自变量1[自变量2]])以POStSCript图案填满

18.13(c:psin文件名 位置 比例)插入一个Postscript(*.eps)文件

18.14(c:render[渲染文件])执行渲染效果

18.15(C:rfileopt格式 自变量1 自变量2 自变量3…)设定执行渲染选项

18.16(c:replay影像文件名 影像类别[选项])展示影像文件TGA、BMP、TIF

18.17(C:rmat模式 选项)控管材质建立、贴附、编辑、分离

18.18(c:rotate3d自变量 1 自变量2…)执行如 ROTATE3D命令各选项顺序

18.19(C:rpref模式 选项[设定])渲染环境设定

18.20(c:saveimg影像文件名影像类别[选项])储存图像文件TGA、BMP、TIF

18.21 (c:scene模式 [选项])    SCENE场景管理

18.22(C:setuv模式 选集 自变量1 自变量2…)SETUV贴图模式管理

18.23(C:showmat自变量1)显示对象的材质贴附信息

18.24(C:solprof自变量  1 自变量工..)建立  3D实体的轮廓影像

18.25(C:StatS[渲染信息文件])显示渲染信息统计信息

十九、ADS、ARX外部定义的数据库相关函数

19.l(c:aseadmin自变量1 自变量2…)管理外部数据库

19.2(c:aseexportt自变量1 自变量2…)输出信息

19.3 (c:aselinks自变量1 自变量2…)连接对象与信息

19.4(c:aserow自变量1 自变量2…)管理外部信息表格

19.5(c:aseselect自变量1 自变量2…)建立外部信息与对象选集

19.6 (c:asesqled自变量 1 自变量2…) 执行SQL程序

发表在 CAD技巧 | 留下评论

AutoCAD R14的菜单定制技术

菜单文件结构及菜单格式

为了保护用户及开发商的既有积累,使产品的过渡较为平缓,又能充分的挖掘Microsoft最新技术的潜力,AutoCAD R14既保留了原有的菜单结构,又对其进行了新的扩展,使得用户和开发商都能充分使用Windows 95/NT平台的图形用户界面(GUI)定制技术对R14的用户界面进行方便的定制。因此,AutoCAD R14菜单不仅包括有原来的各类设备菜单、下拉菜单、光标菜单及屏幕菜单等,还增加并加强了工具条按钮菜单的用户化功能。

1.1 菜单文件结构

根据AutoCAD R14交互界面的不同区域,菜单文件被分为不同节,每一节中包含了许多菜单项。用户可以按自己的需求描述不同节和菜单项,而不一定按照AutoCAD 的菜单文件那样描述所有的节和项。为了实现R14中加载和卸载分部菜单的功能,菜单文件还应包括菜单组名。因此,菜单文件的格式如下:

***MENUGROUP 菜单文件组名,如果用户未写,则以菜单文件全路径名为组名;

***AUXn 系统定点设备按钮菜单(如鼠标键定义);

***POPn下拉菜单或光标菜单;

△***TOOLBARS 工具条按钮菜单;

***IMAGE 图象菜单;

***SCREENn 屏幕菜单;

***TABLETn 数字化仪板菜单;

△***HELPSTRINGS 下拉菜单、光标菜单或工具条按钮的状态行帮助信息;

△***ACCELERATORS 加速键定义;// 注释行。

其中,带”*”的菜单节是R14新增加的内容。

1.2 菜单项格式

R14的菜单项格式为:

name_tag label  menu_macro

名称标识 标签  菜单宏

这个格式对所有的菜单节都是统一的,只是图象菜单项中没有name_tag;而且对于不同的菜单节label的含义也有所不同。其中,name_tag是菜单文件中每个菜单项的唯一标识符,其作用是(1)将下拉菜单和工具条按钮同相应的状态行帮助联系起来;(2)将下拉菜单同其相应加速键联系起来;(3)用于控制菜单项的状态(如可用或不可用);

label是放在[ ]中的显示给用户的有关信息,例如对于TOOLBARS,[ ]中的内容定义了工具条的名称、状态(浮动、隐藏或可见等)、位置及所用的图标等;

menu_macro就是该菜单项或按钮所要执行的动作,可以是AutoCAD命令、AutoLISP程序、ADS/ARX程序等。例如:

***TOOLBARS

**TB_ABD

**ABD

// 定义工具条。

ID_ABD_0 [ _Toolbar(“ABD墙体”,_Floating, _Show, 400, 50, 1)]

// 定义工具条按钮。

ID_ABD_1 [ _Button(“绘制墙体”, “ICON.bmp”, “ICON0041.bmp”)]^C^CABD _WALL:

***HELPSTRINGS

ID_ABD_0 [墙体绘制和编辑.]

ID_ABD_1 [直接绘制双线墙体.]:

如果在菜单源文件中包含以上片段,经过编译调用时,将会出现名为”ABD墙体”的工具条,其中包含一个名为”绘制墙体”按钮。当用户把光标移动到工具条上时,”墙体绘制和编辑。”的帮助信息就出现在窗口的状态行;当用户把光标移动到按钮上时,”直接绘制双线墙体。”的帮助信息就出现在窗口的状态行,同时光标箭头处还有”绘制墙体”的提示。

2 菜单文件组成

要满足用户对菜单定制的新要求,就必须对原有的菜单进行扩充,这不仅表现在菜单结构的变化,还表现在菜单文件组成的变化。R14之前,AutoCAD的菜单原文件为*.MNU,其编译文件为*.MNX;在R14中,*.MNX已不存在,取而代之的是其它几类文件,AutoCAD R14的菜单文件组成如下:

*.MNU AutoCAD R14菜单模板文件(文本格式);

*.MNC AutoCAD R14编译菜单文件(二进制格式);

*.MNS 由AutoCAD R14编译产生的菜单源文件(文本格式);

*.MNR AutoCAD R14菜单中所用的资源文件(二进制格式);

*.MNL 同名菜单加载的AutoLISP程序文件(文本格式);

3 用户菜单文件编制过程

(1)以文本文件方式,按AutoCAD要求的格式编写菜单模板文件*.MNU及其所调用的AutoLISP程序文件*.MNL,如果有工具条菜单,还需同时制作相应的图标文件(小图标16*15点,大图标24*22点);

(2)使用MENU命令编译已经写好的菜单模板文件(选择文件的对话框中的文件类型需要用户自己切换*.MNU),AutoCAD R14将自动生成*.MNC、*.MNS和*.MNR文件;

(3)使用交互方式增加和编辑工具条菜单,AutoCAD R14会自动更新*.MNS文件,如果用户想要保留新增工具条菜单,避免再次编译*.MNU时丢失,就必须手工将*.MNS中的有关内容复制到*.MNU中之后才能使用MENU命令再次编译*.MNU。

4 R14菜单调用的检索顺序

当用户使用交互方式调用菜单,或者使用编程方式调用菜单,AutoCAD R14以如下的文件检索顺序调用菜单:

AutoCAD R14除了能以MENU命令调用菜单,还可以用MENULOAD命令将其它菜单文件中的菜单调入当前图形编辑环境,并且部分或者全部替换当前使用的菜单。在程序中可以使用(MENUCMD)函数和菜单标识来控制菜单的状态。

5 工具条按钮

AutoCAD R14的菜单中大部分内容同原来的菜单相差无几,不再赘述。这里主要介绍工具条的定制方法。

5.1 工具条按钮简介

工具条按钮是Windows系统平台中的一种很方便的交互控制手段,特别是Windows95/NT 4.0平台上,工具条的使用更加灵活和方便,并能由用户快速的进行用户化,从而深受广大Windows系统用户的喜好。AutoCAD R14也充分使用了工具条按钮,并且允许使用多种方法定制工具条。其特点是:(1)定制方便;(2)能显示多种提示和帮助信息

5.2 工具条按钮的定制

(1)直接文件法

用户可以按照R14的菜单文件格式要求,将工具条按钮直接写入菜单模板文件*.MNU中或者菜单原文件*.MNS中,重新编译调用菜单时,工具条按钮将按用户的要求显示出来; (2)交互法

菜单中原先没有工具条按钮时,使用TOOLBAR命令启动工具条管理程序,进行工具条按钮的创建和修改;

菜单中原先已有部分工具条按钮时,只要将鼠标移到任一工具条按钮上按下鼠标右键便可启动工具条管理程序,然后进行工具条按钮属性的修改和编辑。

(3)新建工具条按钮的步骤

启动工具条按钮管理程序;

新建工具条,并输入工具条的有关属性;

在新建的工具条中增加按钮;在新按钮上按”鼠标右键”输入按钮的有关属性;

编辑按钮的图标(ICON)。

6 结束语

AutoCAD R14为用户及开发商提供了一个更为方便的菜单定制机制。特别是工具条按钮菜单的定制技术,使用灵活,定制方便,在应用软件中可以广泛使用。

发表在 CAD技巧 | 留下评论

AutoCAD .NET开发教程

AutoCAD .NET开发教程

发表在 CAD技巧 | 留下评论