字符串对比算法源代码

字符串对比

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

namespace TextCompare
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        public class IndexPair
        {
            /// <summary>
            /// left字符串索引
            /// </summary>
            public int l = 0;
            /// <summary>
            /// right字符串索引
            /// </summary>
            public int r = 0;
            public IndexPair Copy()
            {
                IndexPair newPair = new IndexPair();
                newPair.l = l;
                newPair.r = r;
                return newPair;
            }
        };
        public class IndexPath
        {
            public List<IndexPair> pairList = new List<IndexPair>();

        }
        Color ColorNew = Color.Blue;
        Color ColorDelete = Color.Red;
        Color ColorModify = Color.Yellow;
        Color ColorSame = Color.Green;
        /// <summary>
        /// 改变颜色
        /// </summary>
        /// <param name=”leftStart”></param>
        /// <param name=”leftEnd”></param>
        /// <param name=”rightStart”></param>
        /// <param name=”rightEnd”></param>
        /// <param name=”bSame”></param>
        private void ChangeColor(int leftStart, int leftEnd, int rightStart, int rightEnd, bool bSame)
        {
            int leftLen = leftEnd – leftStart + 1;
            int rightLen = rightEnd – rightStart + 1;
            if (leftLen > rightLen)
            {
                //删除了内容,长度为(leftLen – rightLen)
                richTextBox1.Select(leftStart, leftLen – rightLen);
                richTextBox1.SelectionColor = ColorDelete;
                if (rightLen > 0)
                {
                    //修改了内容,长度为(rightLen)
                    richTextBox2.Select(rightStart, rightLen);
                    richTextBox2.SelectionColor = bSame ? ColorSame : ColorModify;
                    richTextBox1.Select(leftStart + leftLen – rightLen – 1+1, rightLen);
                    richTextBox1.SelectionColor = bSame ? ColorSame : ColorModify;
                }
            }
            else if (leftLen == rightLen)
            {
                //修改了内容,长度为(leftLen)
                richTextBox2.Select(rightStart, rightLen);
                richTextBox2.SelectionColor = bSame ? ColorSame : ColorModify;
                richTextBox1.Select(leftStart, leftLen);
                richTextBox1.SelectionColor = bSame ? ColorSame : ColorModify;

            }
            else
            {
                //增加了内容,长度为(rightLen-leftLen)
                richTextBox2.Select(rightStart, rightLen – leftLen);
                richTextBox2.SelectionColor = ColorNew;
                if (leftLen > 0)
                {
                    //修改了内容,长度为(leftLen)
                    richTextBox1.Select(leftStart, leftLen);
                    richTextBox1.SelectionColor = bSame ? ColorSame : ColorModify;
                    richTextBox2.Select(rightStart + rightLen – leftLen – 1+1, leftLen);
                    richTextBox2.SelectionColor = bSame ? ColorSame : ColorModify;
                }
            }
        }
        private void button1_Click(object sender, EventArgs e)
        {
            string left = textBox1.Text;
            string right = textBox2.Text;
            int leftLen = left.Length;
            int rightLen = right.Length;
            richTextBox1.SelectionColor = Color.Black;
            richTextBox2.SelectionColor = Color.Black;
            richTextBox1.Text = left;
            richTextBox2.Text = right;
            //数据为[left,right]
            bool[,] V = new bool[leftLen, rightLen];
            int l = 0;
            int r = 0;
            for (l = 0; l < leftLen; l++)
            {
                char c1 = left[l];
                for (r = 0; r < rightLen; r++)
                {
                    char c2 = right[r];
                    if (c1 == c2)
                    {
                        V[l, r] = true;
                    }
                    else
                    {
                        V[l, r] = false;
                    }
                }
            }
            int nMax = 0;
            int[,] N = new int[leftLen, rightLen];
            for (l = leftLen – 1; l >= 0; l–)
            {
                for (r = rightLen – 1; r >= 0; r–)
                {
                    if (l == leftLen – 1 && r == rightLen – 1)
                    {
                        if (V[l, r])
                        {
                            N[l, r] = 1;
                        }
                        else
                        {
                            N[l, r] = 0;
                        }
                    }
                    else if (l == leftLen – 1)
                    {
                        if (V[l, r])
                        {
                            N[l, r] = 1;
                        }
                        else
                        {
                            N[l, r] = N[l, r + 1];
                        }
                    }
                    else if (r == rightLen – 1)
                    {
                        if (V[l, r])
                        {
                            N[l, r] = 1;
                        }
                        else
                        {
                            N[l, r] = N[l + 1, r];
                        }
                    }
                    else
                    {
                        N[l, r] = Math.Max(Math.Max(N[l + 1, r], N[l, r + 1]), V[l, r] ? N[l + 1, r + 1] + 1 : N[l + 1, r + 1]);
                    }
                    if (N[l, r] > nMax)
                    {
                        nMax = N[l, r];
                    }
                }
            }
            if (nMax == 0)
            {
                //未找到任何匹配
                ChangeColor(0, leftLen – 1, 0, rightLen – 1, false);
                return;
            }

            List<IndexPair> pairList = new List<IndexPair>();
            for (l = leftLen – 1; l >= 0; l–)
            {
                for (r = rightLen – 1; r >= 0; r–)
                {
                    if (N[l, r] == nMax && V[l, r])
                    {
                        //起始点
                        IndexPair pair = new IndexPair();
                        pair.l = l;
                        pair.r = r;
                        pairList.Add(pair);
                    }
                }
            }
            IndexPair firstIndex = null;
            //寻找最优路径
            int nMin = -1;
            int[,] D = new int[leftLen, rightLen];
            for (l = leftLen – 1; l >= 0; l–)
            {
                for (r = rightLen – 1; r >= 0; r–)
                {
                    if (l == leftLen – 1 && r == rightLen – 1)
                    {
                        if (V[l, r])
                        {
                            D[l, r] = 1;
                        }
                        else
                        {
                            D[l, r] = 0;
                        }
                    }
                    else if (l == leftLen – 1)
                    {
                        if (V[l, r])
                        {
                            D[l, r] = 1;
                        }
                        else
                        {
                            if (D[l, r + 1] > 0)
                            {
                                D[l, r] = D[l, r + 1] + 1;
                            }
                            else
                            {
                                D[l, r] = 0;
                            }
                        }
                    }
                    else if (r == rightLen – 1)
                    {
                        if (V[l, r])
                        {
                            D[l, r] = 1;
                        }
                        else
                        {
                            D[l, r] = D[l + 1, r];
                        }
                    }
                    else
                    {
                        if (V[l, r])
                        {
                            D[l, r] = D[l + 1, r + 1] + 1;
                        }
                        else
                        {
                            if (N[l, r + 1] > N[l + 1, r])
                            {
                                D[l, r] = D[l, r + 1] + 1;
                            }
                            else
                            {
                                D[l, r] = D[l + 1, r];
                            }
                        }
                    }

                }
            }

            for (int i = 0; i < pairList.Count; i++)
            {
                IndexPair pair = pairList[i];
                if (D[pair.l, pair.r] < nMin || nMin < 0)
                {
                    nMin = D[pair.l, pair.r];
                    firstIndex = pair;
                }
            }
            pairList.Clear();
            pairList.Add(firstIndex);
            while (true)
            {
                //寻找下一个合理的点
                IndexPair lastIndex = pairList[pairList.Count – 1];
                if (lastIndex.l == leftLen – 1 || lastIndex.r == rightLen – 1)
                {
                    //找到边缘了
                    if (V[lastIndex.l, lastIndex.r])
                    {
                        IndexPair newPair = new IndexPair();
                        newPair.l = lastIndex.l;
                        newPair.r = lastIndex.r;
                        pairList.Add(newPair);
                        break;
                    }
                    else
                    {
                        if (lastIndex.r != rightLen – 1)
                        {
                            for (r = lastIndex.r + 1; r <= rightLen – 1; r++)
                            {
                                if (V[lastIndex.l, r])
                                {
                                    IndexPair newPair = new IndexPair();
                                    newPair.l = lastIndex.l;
                                    newPair.r = r;
                                    pairList.Add(newPair);
                                    break;
                                }
                            }
                        }
                        else if (lastIndex.l != leftLen – 1)
                        {
                            for (l = lastIndex.l; l <= leftLen – 1; l++)
                            {
                                IndexPair newPair = new IndexPair();
                                newPair.l = l;
                                newPair.r = lastIndex.r;
                                pairList.Add(newPair);
                                break;
                            }
                        }
                        break;
                    }

                }
                if (V[lastIndex.l, lastIndex.r])
                {
                    IndexPair newPair = new IndexPair();
                    newPair.l = lastIndex.l + 1;
                    newPair.r = lastIndex.r + 1;
                    pairList.Add(newPair);
                }
                else
                {
                    if (N[lastIndex.l, lastIndex.r + 1] > N[lastIndex.l + 1, lastIndex.r])
                    {
                        IndexPair newPair = new IndexPair();
                        newPair.l = lastIndex.l;
                        newPair.r = lastIndex.r + 1;
                        pairList.Add(newPair);
                    }
                    else
                    {
                        IndexPair newPair = new IndexPair();
                        newPair.l = lastIndex.l + 1;
                        newPair.r = lastIndex.r;
                        pairList.Add(newPair);
                    }
                }
            }
            for (int i = pairList.Count – 1; i >= 0; i–)
            {
                IndexPair pair = pairList[i];
                if (!V[pair.l, pair.r])
                {
                    pairList.RemoveAt(i);
                }
            }
            for (int i = pairList.Count – 2; i >= 0; i–)
            {
                IndexPair pair1 = pairList[i + 1];
                IndexPair pair2 = pairList[i];
                for (int j = pair1.r – 1; j >= pair2.r + 1; j–)
                {
                    if (right[j] == right[pair2.r])
                    {
                        pair2.r = j;
                        break;
                    }
                }
            }

            int leftLast = 0;
            int rightLast = 0;
            IndexPair pair0 = pairList[0];
            IndexPair pairTmp = pair0;
            //left的pair0.l和right的pair0.r匹配
            ChangeColor(0, pair0.l – 1, 0, pair0.r – 1, false);
            richTextBox1.Select(pair0.l, 1);
            richTextBox1.SelectionColor = ColorSame;
            richTextBox2.Select(pair0.r, 1);
            richTextBox2.SelectionColor = ColorSame;
            for (int i = 1; i < pairList.Count; i++)
            {
                IndexPair pair1 = pairList[i – 1];
                IndexPair pair2 = pairList[i];
                if (pair2.l – pair1.l == 1 &&
                    pair2.r – pair2.r == 1)
                {

                }
                else
                {
                    ChangeColor(pair1.l + 1, pair2.l – 1, pair1.r + 1, pair2.r – 1, false);
                }
                richTextBox1.Select(pair2.l, 1);
                richTextBox1.SelectionColor = ColorSame;
                richTextBox2.Select(pair2.r, 1);
                richTextBox2.SelectionColor = ColorSame;

                if (i == pairList.Count – 1)
                {
                    ChangeColor(pair2.l + 1, leftLen – 1, pair2.r + 1, rightLen – 1, false);
                }
            }
        }
    }
}

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

升级到版本1.0.5

最新版本下载地址:http://yun.baidu.com/share/link?shareid=689240426&uk=721859502

增加了目录比较功能

更新日志

更新时间:2013118
**********************************************
软件新增了注册功能,注册后可无限制使用所有功能
前一百位用户无条件免费注册,详情见
http://www.cadgj.com/?p=364
**********************************************
更新内容:
         1:修补1.0.4发现的BUG
         2:增加功能,清除多行文字格式
         3:增加功能,按颜色选择
         4:增加功能,按颜色选择-多色
         5:增加功能,表格对齐
         6:增加功能,区域搜索
         7:增加功能,批量填充
         8:增加功能,去教育版
         9:增加功能,目录比较,图纸比较的升级版
           可以比较两个目录中的所有图纸

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

谷歌pr升到1了

恭喜网站pr升级到1了,感谢cctv,感谢xxtv,哈哈,纯属搞笑。主要还是持续更新文章内容吧,其中大部分是原创内容应该是主要原因吧,不过毕竟我的主要工作还是写软件,升级还是慢了点,不过总比不升级要好的多,哈哈。

发表在 网站建设 | 标签为 , | 留下评论

通过WMI获取机器码

机器码

源代码下载 GetComputeId

核心代码:通过WMI查询硬件属性+单独获取硬盘ID的代码

注意,并不是所有的都要用,像CPUID不建议使用,因为查询速度很慢。

WMI查询出来的硬盘ID不正确,所以单独使用了一个硬盘ID的获取代码

如果您在线程中使用还需要考虑COM初始化的问题,COM初始化那块要少量修改。

如果您需要考虑到用户重装系统或者双系统切换机器码仍然不能改变,建议使用

主板序列号+主板型号+硬盘ID(不能通过WMI获取,请使用专门代码获取,部分机器可能取不到,三个中至少获取到两个对于一般机器应该都可以了)

typedef struct _T_WQL_QUERY 

    CHAR*   szSelect;       // SELECT语句  
    WCHAR*  szProperty;     // 属性字段
 TCHAR*  szName;//名称
} T_WQL_QUERY;
// WQL查询语句  
const T_WQL_QUERY szWQLQuery[] = { 
    // 网卡原生MAC地址  
    “SELECT * FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE ‘ROOT%’))”, 
    L”PNPDeviceID”,
 _T(“网卡原生MAC地址”),
 
    // 硬盘序列号  
    “SELECT * FROM Win32_DiskDrive WHERE (SerialNumber IS NOT NULL) AND (MediaType LIKE ‘Fixed hard disk%’)”, 
    L”SerialNumber”,
 _T(“硬盘序列号”),
 
    // 主板序列号  
    “SELECT * FROM Win32_BaseBoard WHERE (SerialNumber IS NOT NULL)”, 
    L”SerialNumber”,
 _T(“主板序列号”),    
 
    // 处理器ID  
    “SELECT * FROM Win32_Processor WHERE (ProcessorId IS NOT NULL)”, 
    L”ProcessorId”,
 _T(“处理器ID”), 
 
    // BIOS序列号  
    “SELECT * FROM Win32_BIOS WHERE (SerialNumber IS NOT NULL)”, 
    L”SerialNumber”,
 _T(“BIOS序列号”), 
 
    // 主板型号  
    “SELECT * FROM Win32_BaseBoard WHERE (Product IS NOT NULL)”, 
    L”Product”,
 _T(“主板型号”),
 
    // 网卡当前MAC地址  
    “SELECT * FROM Win32_NetworkAdapter WHERE (MACAddress IS NOT NULL) AND (NOT (PNPDeviceID LIKE ‘ROOT%’))”, 
    L”MACAddress”,
 _T(“网卡当前MAC地址”)
};
int Test(CString& strResult)
{
 HRESULT hres;

    // Step 1: ————————————————–
    // Initialize COM. ——————————————

    hres =  CoInitializeEx(0, COINIT_MULTITHREADED);
    if (FAILED(hres))
    {
        cout << “Failed to initialize COM library. Error code = 0x”
            << hex << hres << endl;
        return 1;                  // Program has failed.
    }

    // Step 2: ————————————————–
    // Set general COM security levels ————————–
    // Note: If you are using Windows 2000, you need to specify –
    // the default authentication credentials for a user by using
    // a SOLE_AUTHENTICATION_LIST structure in the pAuthList —-
    // parameter of CoInitializeSecurity ————————

    hres =  CoInitializeSecurity(
        NULL,
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_DEFAULT,   // Default authentication
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation 
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities
        NULL                         // Reserved
        );

                     
    if (FAILED(hres))
    {
        cout << “Failed to initialize security. Error code = 0x”
            << hex << hres << endl;
        CoUninitialize();
        return 1;                    // Program has failed.
    }
   
    // Step 3: —————————————————
    // Obtain the initial locator to WMI ————————-

    IWbemLocator *pLoc = NULL;

    hres = CoCreateInstance(
        CLSID_WbemLocator,            
        0,
        CLSCTX_INPROC_SERVER,
        IID_IWbemLocator, (LPVOID *) &pLoc);
 
    if (FAILED(hres))
    {
        cout << “Failed to create IWbemLocator object.”
            << ” Err code = 0x”
            << hex << hres << endl;
        CoUninitialize();
        return 1;                 // Program has failed.
    }

    // Step 4: —————————————————–
    // Connect to WMI through the IWbemLocator::ConnectServer method

    IWbemServices *pSvc = NULL;
 
    // Connect to the root\cimv2 namespace with
    // the current user and obtain pointer pSvc
    // to make IWbemServices calls.
    hres = pLoc->ConnectServer(
         _bstr_t(L”ROOT\\CIMV2″), // Object path of WMI namespace
         NULL,                    // User name. NULL = current user
         NULL,                    // User password. NULL = current
         0,                       // Locale. NULL indicates current
         NULL,                    // Security flags.
         0,                       // Authority (for example, Kerberos)
         0,                       // Context object
         &pSvc                    // pointer to IWbemServices proxy
         );
   
    if (FAILED(hres))
    {
        cout << “Could not connect. Error code = 0x”
             << hex << hres << endl;
        pLoc->Release();    
        CoUninitialize();
        return 1;                // Program has failed.
    }

    cout << “Connected to ROOT\\CIMV2 WMI namespace” << endl;
    // Step 5: ————————————————–
    // Set security levels on the proxy ————————-

    hres = CoSetProxyBlanket(
       pSvc,                        // Indicates the proxy to set
       RPC_C_AUTHN_WINNT,           // RPC_C_AUTHN_xxx
       RPC_C_AUTHZ_NONE,            // RPC_C_AUTHZ_xxx
       NULL,                        // Server principal name
       RPC_C_AUTHN_LEVEL_CALL,      // RPC_C_AUTHN_LEVEL_xxx
       RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
       NULL,                        // client identity
       EOAC_NONE                    // proxy capabilities
    );

    if (FAILED(hres))
    {
        cout << “Could not set proxy blanket. Error code = 0x”
            << hex << hres << endl;
        pSvc->Release();
        pLoc->Release();    
        CoUninitialize();
        return 1;               // Program has failed.
    }
 for(int i=0;i<6;i++)
 {
  const _T_WQL_QUERY query=szWQLQuery[i];
  // Step 6: ————————————————–
  // Use the IWbemServices pointer to make requests of WMI —-

  // For example, get the name of the operating system
  IEnumWbemClassObject* pEnumerator = NULL;
  hres = pSvc->ExecQuery(
   bstr_t(“WQL”),
   bstr_t(query.szSelect),
   WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
   NULL,
   &pEnumerator);

  if (FAILED(hres))
  {
   cout << “Query for operating system name failed.”
    << ” Error code = 0x”
    << hex << hres << endl;
   pSvc->Release();
   pLoc->Release();
   CoUninitialize();
   return 1;               // Program has failed.
  }

  // Step 7: ————————————————-
  // Get the data from the query in step 6 ——————-

  IWbemClassObject *pclsObj;
  ULONG uReturn = 0;

  while (pEnumerator)
  {
   HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
    &pclsObj, &uReturn);

   if(0 == uReturn)
   {
    break;
   }

   VARIANT vtProp;

   // Get the value of the Name property
   hr = pclsObj->Get(query.szProperty, 0, &vtProp, 0, 0);
   if(FAILED(hr))
   {
    break;
   }
   CString strTmp=query.szName;
   strTmp+=_T(“=”);
   strTmp+=vtProp.bstrVal;
   if(!strResult.IsEmpty())
   {
    strResult+=_T(“\r\n”);
   }
   strResult+=strTmp;
   wcout << ” OS Name : ” << vtProp.bstrVal << endl;
   VariantClear(&vtProp);

   pclsObj->Release();
  }
  pEnumerator->Release();
  /*
  const _T_WQL_QUERY query=szWQLQuery[i];
  // Step 6: ————————————————–
  // Use the IWbemServices pointer to make requests of WMI —-

  // For example, get the name of the operating system
  IEnumWbemClassObject* pEnumerator = NULL;
  hres = pSvc->ExecQuery(
   bstr_t(“WQL”),
   bstr_t(“SELECT * FROM Win32_OperatingSystem”),
   WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
   NULL,
   &pEnumerator);

  if (FAILED(hres))
  {
   cout << “Query for operating system name failed.”
    << ” Error code = 0x”
    << hex << hres << endl;
   pSvc->Release();
   pLoc->Release();
   CoUninitialize();
   return 1;               // Program has failed.
  }

  // Step 7: ————————————————-
  // Get the data from the query in step 6 ——————-

  IWbemClassObject *pclsObj;
  ULONG uReturn = 0;

  while (pEnumerator)
  {
   HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
    &pclsObj, &uReturn);

   if(0 == uReturn)
   {
    break;
   }

   VARIANT vtProp;

   // Get the value of the Name property
   hr = pclsObj->Get(L”Name”, 0, &vtProp, 0, 0);
   wcout << ” OS Name : ” << vtProp.bstrVal << endl;
   VariantClear(&vtProp);

   pclsObj->Release();
  }
  pEnumerator->Release();
  */
 }

    // Cleanup
    // ========
   
    pSvc->Release();
    pLoc->Release();
    CoUninitialize();

    return 0;   // Program successfully completed.

}

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

CAD做图二十四字秘诀

此篇文章是从土木在线摘过来的一篇帖子,觉得对于CAD使用者还是很有帮助的,我根据个人理解对其中的一些文字做了简单调整,在此与大家分享。
 
已经广泛应用于建筑、电子、机械等相关行业。笔者在多年的CAD教学与工作中发现,有很多CAD使用者并没有掌握好一些基本技巧,经常出现作图效率低下、精确度不够等问题。于是,笔者总结出了几条使用CAD软件的经验与技巧,希望能给大家提供一些帮助。

  1.经常存盘

  这是每一个设计人员必须牢记的一条准则,突然断电、死机等都有可能让你的作品及灵感消失得无影无踪。在CAD中,我们也可以让CAD自动存盘:点击“工具→选项”,出现“选项”对话框,进入“文件”选项卡,设置“自动保存路径”,然后在“打开和保存”选项卡里设置“自动保存”及保存时间间隔。

就算是AutoCAD,世界上最好的二维CAD软件,也难免会出现异常退出的情况。
  注意:不要把时间间隔设得太短,那样会浪费系统资源,一般设10分钟就可以了。

  2.多看提示

  CAD软件是一套比较人性化的软件,每一步操作都会有提示指导。就算某个命令你原来从未使用过,只要根据提示一步一步做下去,也能完成。CAD软件的命令行提示高度,一般要两到三行,这样就能完全看到每一步的提示。

  多看提示的好处:可以学习从未用过的命令,学习同一命令的多种用法。

  3.巧用命令

  命令可以理解为快捷键。CAD有很多种命令调用方法,而且同一个命令往往又有好几种使用方式,如点击菜单、点击工具栏图标、输入键盘命令、回车、空格键重复命令等方式。好多人都觉得用工具图标比较快,其实用键盘输入命令是最快的。我们一定要记住常用的命令。如直线“L”、多段线“PL”、复制“CO、CP”、删除“E”、移动“M”、列表“LIST”、镜像“MI”等。掌握键盘命令有一个简便方法,那就是在点击菜单或图标时,命令行都会出现该命令的键盘命令全称,我们可以试着输入命令全称的前一至两个字母,一般那就是该命令的缩写。

  4.良好习惯

  养成良好的作图习惯,作品的可移植性和可读性会大大提高。笔者指的良好习惯有:

  ①能用多段线(PLINE)作图就不要用直线(LINE),因为多段线是一个对象,在以后选择或二次加工时会很方便。

  ②用好图层(LAYER)功能,把不同类型的对象分配到不同的图层中,以便以后分类加工。

  ③灵活运用分组(GROUP)及块定义(BLOCK)功能,力求把同一组对象一次性选中,以防编辑时漏掉其中某一部分。

  ④常用的作图界限、尺寸、标注样式、文字样式等要做好模板,以便快速调用。

  ⑤不要轻易炸开(EXPLODE)系统生成的填充样式、标注等,这对你以后编辑有帮助。

  ⑥尽量不要使用系统默认字体以外的字体,以防传输至其他电脑里时产生乱码。

  ⑦模型空间只用来作图,图纸空间只用来放置图框。

  5.精确作图

  自然在其他作图软件(如Photoshop、3DSMAX等)里,精确作图也是一个重要的规范,但是这一条在CAD中尤其重要。CAD里面所有的物体,系统都会严格按作图者给定的尺寸绘制,即使你的尺寸是随便给出的。有些朋友在作图时忽视尺寸,标注时尺寸就不正确,然后再把标注打散后改正,这是要严格禁止的,因为这时的图已经没有实际尺寸的比例了,也不会再根据你的编辑改动而实时自动改正了。精确作图对我们以后进行标注、打印输出、图像调入调出和与他人分享都非常重要。根据笔者的经验,我们要注意以下几点:

  ①作图时严格按1:1比例,在最后打印输出时再调整比例。

  ②灵活运用点捕捉功能,不要以为自己眼力过人,随便一点就能点中直线的端点,那是不可能的。

  ③该闭合的线一定要用命令闭合(CLOSE)。

  ④对于已知的长度,我们可以用键盘直接输入。

  ⑤灵活运用正交模式、栅格与捕捉。

  6.用“心”作图

  这一条是献给所有奋战在设计岗位上的朋友们的,只有用心作图,我们才能作出正确、合乎规范、漂亮的图纸,我们的劳动成果才会更容易被认可,效率才能得到真正提高。

  使用CAD软件其实不难,只要记住笔者上面的“二十四字秘诀”,在实践中经常练习,你的CAD水平一定会在短时间内提高一个台阶。

 
以上技巧适用于AUTOCAD及浩辰CAD等常用CAD软件。
发表在 CAD技巧 | 标签为 | 留下评论

CAD快速绘图的基本技巧

一、熟悉对CAD中基本操作命令/快捷图标的使用
  这一点大多数人都知道,古人云:熟能生巧。基本命令与快捷图标便是CAD中大家最熟悉的,也应该能熟练掌握了,所以不详谈了。
二、 根据自己的习惯定制快捷键
  大家都知道LINE命令可简化为L,为何会如此呢?因为在CAD中有一个命令别名文件*.PGP(AutoCAD 为acad.pgp、浩辰CAD为icad.pgp)中定义了LINE命令的简写,先找出这个文件打开它。也可以在菜单中找到:工具》自定义》编辑程序参数的命令。

在PGP文件中包括对命令简写的定义,记住它的左列是简写命令的文字实现你可以根据你的需要进行修改(当然是你比较熟悉的英文缩写喽),它的右列是默认的命令请不要随意修改。通常情况下将自己最常用的命令定义一个字母,较常用的定义为两个字母。定义时记住不要多个命令对应一个别名。

三、对图形夹点操作
  夹点,你用过吗?当你用鼠标左键点击图形,图形上便会出现许多方框这些就是夹点。通过控制夹点便能进行一些基本的编辑操作。如:COPY,MOVE,改变图形所在的图层等基本操作。而且不同的图形,还有其特殊的操作。如:直线有延伸操作。选中夹点后右键可以选择对夹点的编辑方式,如果右键菜单关闭了,可以看命令行提示,可以输入参数的关键字,或按空格键切换操作方式。

 

四、大量使用修改命令
  对于CAD绘图工作人员来说,一幅图60%–70%是修改只有30%–40%是作图,这一点并不难理解。从图形构成来看图形只有直线与曲线这两种,而曲线又由大量的圆进行剪切而成的,所以一张图最终由直线和圆组成。既然如此作图只需先画圆或直线并确定位置,然后进行一系列操作如:OFFSET,
TRIM, FILLET, ARRAY, CHAMFER等,来实现图形。
  如一个轴承的绘图,只需两条互相垂直的直线,而后进行OFFSET,FILLET,CHAMFER等一系列操作便能精确的完成轴承的绘制。

五、构建图块来简化绘图工作
  图块是CAD操作中比较核心的工作,许多程序员与绘图工作者都建立了各种各样的图块。由于他们的工作给我们的带来了简便,我们能像砖瓦一样使用这些图块。如工程制图中建立各个规格的齿轮与轴承;建筑制图中建立一些门、窗、楼梯、台阶等以便在绘制时方便调用。

块可以用B(block)命令直接定义并保存在图纸中,也可以用W(wblock)命令写成一个块文件方便在其他文件中插入I(insert),定义块时注意要取一个比较容易分辨的名字,尤其是有很多类似图块时,另外非常主要的一点是要合理定义插入点,这个插入点是插入图块时定位点。图块的运用将进一步的提高绘图的速度。

发表在 CAD技巧 | 标签为 | 留下评论

如何提高CAD的运行效率?

有些行业的图纸非常大,例如一些规划图纸、地形图,少则十几兆,多则上百兆,这类图纸对机器、软件要求都比较高。如何在现有硬件配置状态下,进一步提高CAD绘图效率,很多人都非常关心。

之前也发过一些关于这个问题的文章,下面重新总结一下,希望能对大家有帮助。

 

一、优化软硬件系统,使你的机器处于最佳工作状态。

首先要掌握一些优化系统的基本技巧,保证你的机器、Windows系统能健康高效的运行,然后要保证你的CAD软件也能正常运转。

1、定义清理维护磁盘,优化Windows系统性能

2、定期整理磁盘碎片,优化Windows系统性能

3、在使用CAD时候尽量少开其他应用程序,腾出更多物理内存给CAD使用

4、优化系统服务,去掉无用的服务,让操作系统工作更加快捷。

5、优化系统IO缓冲区,这样大幅度提升大数据量时候的内存工作效能到注册表
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\IoPageLockLimit,根据你的内存修改其十六进制值(64M: 1000;128M: 4000;256M: 10000;512M或更大: 40000)。

6、使用优秀杀毒软件,最大程度避免病毒恶意软件对系统速度的影响。

7、注意预防CAD病毒。

现在有一些CAD病毒,会恶意加载一些程序,善意的只是弹出一些莫名奇妙的对话框,恶意的则会影响CAD运行或命令使用。因此在从别处复制图纸时一定要注意不要同时复制acad*.lsp\acad*.fas\acad*.vlx等AutoCAD会自动加载的程序,这类很有可能是病毒。

 

二、合理设置CAD,养成良好的使用习惯,优化CAD系统

每个人都有自己的使用习惯,但如果能养成良好的使用习惯,合理设置一些CAD选项,也可以有效提高CAD的绘图效率。

1、合理设置快捷键,记住常用的快捷键,养成左手键盘,右手鼠标的操作习惯。

左手键盘和右手鼠标配合,这是大多数高手的使用习惯。要充分发挥这些优势,可以将常用功能的快捷键都设置到左手。关于快捷键见博客中相关文章的介绍。

2、尽量使用CAD专用的单线字体(*.SHX)。

如果图中有大量文字,并且都是用操作系统自带的TTF字体(宋体、黑体等),显示数据将非常大,整体操作性能将会很低,因为TTF字体是由字体轮廓+填充组成,显示数据量要比SHX字体多数倍。

3、选择适当的填充图案和比例

该使用实体(solid)填充时一定不要误用其他填充图案,密集的其他填充图案可以得到类似SOLID的效果,但由于有大量线条,虽然对DWG文件大小影响不大,但会增加大量显示数据,会导致CAD性能明显降低。我就见过好几张图纸因为使用类似填充导致AutoCAD 2004或2007无法打开或打开后无响应。

4、合理设置自动保存时间。

不要将自动保存间隔设置得过短,例如5分钟,最好设置为半小时以上,CAD默认设置一般是120分钟。图纸大的时候,自动保存会占用很多时间,如果时间间隔设置过短,频繁自动保存对整体操作速度还是有较大影响的。建议自动保存间隔设置长一些,做了重要图形绘制或修改后手动按CTRL+S保存就好了。

5、设置适当的圆弧显示精度

有些人为了是圆缩放过程中不至于变成多边形,将圆弧显示精度(viewres)设置得非常高,这并不是一个好习惯。显示精度提高后,每个圆或弧都将用更多段数来显示,将增加显示的数据量,因此会影响图纸的操作性能。建议不要修改默认的圆弧显示精度,甚至可以使用更低的圆弧显示精度。虽然圆有时会显示多边形,但RE很快就可以解决问题。

6、合理设置自动保存时间。

有些人担心CAD异常退出,将自动保存间隔设置得非常短,例如5分钟。如果通常编辑的的都是非常小的图纸,这个问题不大。图纸大的时候,自动保存会占用很多时间,如果时间间隔设置过短,频繁自动保存对整体操作速度还是有较大影响的。CAD默认设置一般是120分钟,建议设置为半小时以上,做了重要图形绘制或修改后手动按CTRL+S保存就好了。

7、合理使用图层开关或锁定。

当图形比较复杂时,将一些干扰操作的图层关闭或锁定,不仅可以提高操作效率,也可以提高显示性能。

8、关闭选择区域显示效果及选择预览效果,提升选择速度。

在CAD高版本,框选时增加了颜色显示来区别窗选(window)和交叉选择(Crossing),在后期版本又增加了选择预览效果,当光标移动到图形上,图形就会亮显以提示哪些对象会被选中。这些效果的增加无疑给我们提供了很多方便,但同时这些处理肯定会占用一些系统资源,如果觉得这些无关紧要的话,可以在选项对话框(OP)中将这些效果取消。

9、关闭一些显示选项,提高缩放平移的速度。

缩放时候不显示填充,在文字非常小无法显示时候显示为框。输入OP,打开“选项”对话框,在“显示”选项卡中可以设置一些显示选项,你觉得哪些显示对你无关紧要的都可以取消。例如缩放不显示填充,是可以优化填充较多图纸缩放时性能,但如果图中有大面积填充的话,缩放或平移时图面闪动会比较厉害,对眼睛又不太好。。

10、合理设置插入光栅图像的分辨率。

在插入光栅图像时最好根据最终输出图纸尺寸的需求算一下图像的分辨率,将图像调整到满足要求就好,不要一味要求高分辨率。高分辨率图像在显示和打印时对性能影响都非常明显。

 

三、使用二次开发软件,加速设计进度。

二次开发软件都是利用CAD提供的开发接口,针对行业需求,开发了一些专用功能,可以成倍提高绘图效率。

例如画一张建筑图纸,直接用通用的CAD,例如AutoCAD或浩辰CAD等,你需要用直线或双线去画墙,相交墙体还需要进行修剪或多线编辑,如果插入一个窗户,还需要将墙手动断开;假设用浩辰CAD建筑2012,直接提供了画墙体的功能,墙体交叉、拐角都会自动处理,插入门窗自动打断,门窗移动或删除墙体自动更新,绘图效率和改图效率都可以数倍提升。

各行各业类似的专业CAD系统有很多,例如机械、服装、结构、电气、暖通、给排水、市政、桥梁等等,找到一款合适的专业软件,绘图时会事半功倍!

发表在 CAD技巧 | 标签为 | 留下评论

给CAD初学者的一些建议

从网上找到这么一篇文章,觉得对CAD初学者还是很有帮助的,特此转载。原文写的比较简单,我在一些地方用红字加上了一些注解,希望能帮助初学者加深理解。

 

  一、基础很重要 
  实践证明,“手工图板”绘图能力是计算机绘图能力的基础,学习CAD,需要一定的画法几何的知识和能力,需要一定的识图能力,尤其是几何作图能力,一般来说,手工绘图水平高的人,学起来较容易些,效果较好!  
  二、循序渐进
  整个学习过程应采用循序渐进的方式,先了解计算机绘图的基本知识,如相对直角坐标和相对极坐标等,使自己能由浅入深,由简到繁地掌握CAD的使用技术。  
  三、学以致用  
  在学习CAD命令时始终要与实际应用相结合,不要把主要精力花费在各个命令孤立地学习上;把学以致用的原则贯穿整个学习过程,使自己对绘图命令有深刻和形象的理解,有利于培养自己应用CAD独立完成绘图的能力。  
  四、熟能生巧  
  要强迫自己做几个综合实例,详细地进行图形的绘制,使自己可以从全局的角度掌握整个绘图过程。
  
  需要掌握的技巧:
  
  1、常见问题要弄懂
  
  (1)同样画一张图,有的人画的大小适中,有的人画的图形就很小,甚至看不见,这是因为绘图区域界限的设定操作没有做,或虽用LIMITS命令进行了设定,但忘记了用ZOOM命令中的ALL选项对绘图区重新进行规整。绘图区域的设定是根据实际的绘图需要来进行的。

   注:现在有没有LIMITS并不重要了,通常按1:1的尺寸绘图就好了,但是需要掌握缩放和平移的基本技巧而已。关键是要了解绘图比例和出图比例的概念,在绘图的时候就要考虑到最终出图的比例,通过比例决定文字高度、标注样式的设置。
  
  (2)有人用虚线画线,但发现画出的线看上去像是实线,这是“线型比例”不合适引起的,也就是说“线型比例”太大,也可能是太小。结局问题的办法是将线型管理器对话框打开,修改其“全局比例因子”至合适的数值即可。

注:最关键还是要对你的尺寸有个基本概念,如果尺寸很小,就将线型比例调整小一些,如果图形尺寸特别大,就将线型比例调整大一些,线型的一个单元的长度一般都在10个单位以内。
  
  (3)在进行尺寸标注以后,有时发现不能看到所标注的尺寸文本,这是因为尺寸标注的整体比例因子设置的太小,将尺寸标注方式对话框打开,修改其数值即可。

    注:看到标注文字是很重要,更重要的是打印出来后标注线和文字大小要合适,比如1:1绘图,1:100打印,要求打印文字高度为3mm,那么标注文字的高度就应该设置为300,标注线的尺寸也要相应调大100倍

  
  以上三个问题仅仅是我上机过程中遇到的最典型的三个问题和困难。实际问题不胜枚举,作为初学者彻底弄懂这些问题,很有必要,对提高绘图质量和效率很有帮助。
  
  2、有比较,才有鉴别  
  容易混淆的命令,要注意使自己弄清它们之间的区别。如ZOOM和SCAIE,PAN和MOVE,DIVIDE和MEASURE等等。

注:视图缩放和平移跟图形的缩放和移动初学者确实容易搞混。视图的变化就象相机镜头的拉近拉远、平移,图形本身尺寸并不变,而图形的移动和平移是对图形的尺寸和位置进行了修改,自己对比一下很快就明白了。

 

    3、层次要分明
  图层就像是透明的覆盖图,运用它可以很好地组织不同类型的图形信息。学习过程中,有的人图省事,直接从对象特性工具栏的下拉列表框中选取颜色,线型和线宽等实体信息,这很不好,使得处理图形中的信息不那么容易,要特别注意纠正自己的这一不好习惯。严格做到层次分明,规范作图。我的体会是:养成良好习惯,受益匪浅。
  
  4、粗线要清楚  
  使用线宽,可是用粗线和细线清楚地展现出部件的截面,标高的深度,尺寸线以及不同的对象厚度。作为初学者,一定要通过图层指定线宽,显示线宽。提高自己的图纸质量和表达水平。

   

    注:不同行业、同一行业的不同专业对图层、颜色、线宽的要求也不一样。设计单位对图纸都是有明确的要求的,在学习的时候就养成良好的习惯,对将来工作肯定有好处。
  
  5、内外有别  
  利用CAD的“块”以及属性功能,可以大大提高绘图效率。“块”有内部块与外部图块之分。内部图块是在一个文件内定义的图块,可以在该文件内部自由作用,内部图块一旦被定义,它就和文件同时被存储和打开。外部图块将“块”以文件的形式写入磁盘,其他图形文件也可以使用它,要注意这时候外部图块和内部图块的一个重要区别。
  注:内部块用B(Block)命令定义,外部块用W(WBLOCK)来定义,无论定义内部块和外部块,指定合适的插入点都非常重要,否则插入图块的时候会很麻烦。

  6、滴水不漏  
  图案填充要特别注意的地方是构成阴影区域边界的实体必须在它们的端点处相交,也就是说要封闭,要做到“滴水不漏”;否则会产生错误的填充。初学者一定要学会如何查找“漏洞”,修复错误。
  
  7、写文字要规范  
  文字是工程图中不可缺少的一部分,比如:尺寸标注文字、图纸说明,注释、标题等,文字和图形一起表达完整的设计思想。尽管CAD提供了很强的文字处理功能,但符合工程制图规范的文字,并没有直接提供。因此要学会设置“长仿宋体”这一规范文字。具体操作的简要步骤是,打开“文字样式”对话框,新建一个样式,可取名为“长仿宋体”,对话框中字体名改为选用“仿宋体GB-2312”,宽度比例也要改为0.67。尺寸标注的文字可改为“italic.shx”代替“仿宋体GB-2312”。

注:如果图纸比较小,可以用操作系统的字体,例如宋体等,如果图纸大,文字多,建议使用CAD自带的单线*.SHX字体,这种字体比操作系统字体占用的系统资源要少得多。使用SHX字体时要正常显示中文,需要使用大字体,大字体就是针对中、日、韩等双字节文字专门定义的字体,详细讲解请参看博客中的相关文章。
  另一种规范文字更简单的方法是,直接使用CAD样板文件提供的“工程字”样式;注意,使用前要用“使用模板”方式启动CAD,选择国标标题(如:GBA3)进入绘图状态。再将“工程字“样式置为当前工作样式。这种方法,大多数教科书中没有提及,初学者要注意补充一下这一训练。

  8、特殊字符,特殊处理  
  实际绘图中,常需要输入一些特殊字符,如角度标志,直径符号等。这些中利用CAD提供的控制码来输入,较易掌握。另一些特殊字符,如“£”、“a”、“g”等等希腊字母的输入,掌握起来就不那么容易了。它要利用到MTEXT命令的“其他…”选项,拷贝特殊字体的希腊字母,再粘贴到书写区等操作。尤其要注意字体的转换等编辑。还有一些特殊的文本,如“φ”在机械制图中应用的较多,叫做带上、下偏差的尺寸公差标注,也可用到MTEXT命令的“堆叠”功能来实现。这样做远比在尺寸标注对话框中调节响应功能数值方便得多。我个人的体会是:特别方便!  

 

    9、不依规矩,不成方圆  
  工程标注是零件制造、工程施工和零部件装配时的重要依据。在任何时候一幅工程图中,工程标注是不可少的重要部分。在某些情况下,工程标注甚至比图形更重要。许多初学者不怕绘图,怕标注;原因之一是尺寸标注方式对话框里选项太多,自己又理解不清,更不知道这些选项之间如何配合,所以往往很难达到理想的标注效果。为此,除应弄清对话框里各选取项的含义及常用值外,还应督促自己学习时应遵守如下五个规程:  
  (1)为尺寸标注创建一个独立的层,使之与图形的其他信息分开,便于进行各种操作。  
  (2)为尺寸文本建立专门的文字样式(如前述“长仿宋体“)和大小。  
  (3)将尺寸单位设置为所希望的计量单位,并将精度取到所希望的最小单位。  
  (4)利用尺寸方式对话框,将整体比例因子设置为绘图形时的比例因子。

    (5)充分利用目标捕捉方式,以便快捷拾取特征点。  
  (6)两个空间、两个作用、两个练习。在CAD环境中有两种空间:模型空间和图纸空间,其作用是不同。一般来说,模型空间是一个三维空间,主要用来设计零件和图形的几何形状,设计者一般在模型空间完成其主要的设计构思;而图纸空间是用来将几何模型表达到工程图之上用的,专门用来进行出图的;图纸空间有时又称为“布局“,是一种图纸空间环境,它模拟图纸页面,提供直观的打印设置。在图纸空间中可以创建并放置视口对象,还可以添加标题栏或其他几何图形。可以在图形中创建多个布局以显示不同视图,每个布局可以包含不同的打印比例和图纸尺寸。布局显示的图形与图纸页面上打印出来的图形完全一样。  

  10.九九归一  
  计算机绘图的目标就是要使设计的结果在生产实践中发挥作用。目前的设计结果基本上以纸基图纸的方式进入到生产中,同时,在设计单位,纸基的图纸也是图纸档案管理的主要对象。虽然计算机辅助设计的发展方向是达到设计、生产的无纸化,但除了极少数大型的企业外,绝大多数普通的设计生产单位还是以纸基图作为组织设计生产的依据。因此,怎样将CAD设计生产的电子格式的图纸转换成描绘在规定幅面上的纸基格式的图纸,是一个与生产实际结合得非常紧密的问题,在某种意义来说,这一步与图形的修改、编辑等绘图过程同等重要。
  

 以上技巧适用于AUTOCAD、浩辰CAD及其他兼容的CAD软件。

发表在 CAD技巧 | 标签为 | 留下评论

ObjectArx示例代码,在文件菜单下增加一个自己的菜单

//GMenu.h

#pragma once

#if _MSC_VER >= 1600
#import “acax19enu.tlb” no_implementation raw_interfaces_only named_guids //访问菜单时,需要导入该类型库
#elif _MSC_VER >= 1500
#import “acax18enu.tlb” no_implementation raw_interfaces_only named_guids //访问菜单时,需要导入该类型库
#elif _MSC_VER >= 1400
#import “acax17enu.tlb” no_implementation raw_interfaces_only named_guids //访问菜单时,需要导入该类型库
#elif _MSC_VER >= 1300
#import “acax16enu.tlb” no_implementation raw_interfaces_only named_guids //访问菜单时,需要导入该类型库
#endif

namespace GMenu
{
    /*!
     @brief 添加菜单
     */
    bool AddMenu();
};

//GMenu.cpp

#include “StdAfx.h”
#include “GMenu.h”

namespace GMenu
{
 struct PopupMenuInfo
 {
  CString strName;
  CString strTagString;
 };
 bool GetInfo(PopupMenuInfo& info,AutoCAD::IAcadPopupMenu* pPopUpMenu)
 {
  BSTR name = ::SysAllocString(L””);
   pPopUpMenu->get_Name(&name);
   info.strName=name;
   ::SysFreeString(name);
   BSTR tagString = ::SysAllocString(L””);
   pPopUpMenu->get_TagString(&tagString);
   info.strTagString=tagString;
   ::SysFreeString(tagString);
  return true;
 }
 struct PopupMenuItemInfo
 {
  CString strCaption;
  CString strTagString;
 };
 bool GetInfo(PopupMenuItemInfo& info,AutoCAD::IAcadPopupMenuItem* pPopUpMenuItem)
 {
  BSTR caption = ::SysAllocString(L””);
  pPopUpMenuItem->get_Caption(&caption);
  info.strCaption=caption;
  ::SysFreeString(caption);
  BSTR tagString = ::SysAllocString(L””);
   pPopUpMenuItem->get_TagString(&tagString);
   info.strTagString=tagString;
   ::SysFreeString(tagString);
  return true;
 }
 int EnumFileMenu(AutoCAD::IAcadPopupMenu* pPopUpMenu)
 {
  bool bFind=false;
  long count;
  HRESULT hr=pPopUpMenu->get_Count(&count);
  if(FAILED(hr))
  {
   return -1;
  }
  VARIANT index;
  VariantInit(&index);
  for(int j=0;j<count;j++)
  {
   AutoCAD::IAcadPopupMenuItem* pPopUpMenuItem;
   
   V_VT(&index) = VT_I4;
   V_I4(&index) = j;
   hr=pPopUpMenu->Item(index,&pPopUpMenuItem);
   if(FAILED(hr))
   {
    continue;
   }
   PopupMenuItemInfo info;
   GetInfo(info,pPopUpMenuItem);
   if(info.strTagString.CompareNoCase(_T(“ID_MnDrawing”))==0)
   {
    //绘图实用程序
    bFind=true;
   }
   else
   {
    AutoCAD::AcMenuItemType itemType;
    pPopUpMenuItem->get_Type(&itemType);
    if(itemType==AutoCAD::acMenuSeparator&&bFind)
    {
     //绘图实用程序菜单找到之后,再找到分隔符
     pPopUpMenuItem->Release();
     return j;
    }
   }
   pPopUpMenuItem->Release();
  }
  

  return -1;
 }
 bool AddMenu()
 {
  AutoCAD::IAcadApplication* pAcad;
  AutoCAD::IAcadMenuBar* pMenuBar;
  AutoCAD::IAcadMenuGroups* pMenuGroups;
  

  HRESULT hr = NOERROR;
  LPUNKNOWN pUnk = NULL;
  LPDISPATCH pAcadDisp = NULL;
  pAcadDisp = acedGetAcadWinApp()->GetIDispatch(TRUE);
  if (pAcadDisp == NULL)
  {
   return false;
  }
  hr = pAcadDisp->QueryInterface(AutoCAD::IID_IAcadApplication,(void**)&pAcad);
  pAcadDisp->Release();
  if (FAILED(hr))
  {
   return false;
  }

  pAcad->put_Visible(true);
  pAcad->get_MenuBar(&pMenuBar);
  //得到整个CAD的菜单
  pAcad->get_MenuGroups(&pMenuGroups);
  pAcad->Release();
  long numberOfMenus;
  pMenuBar->get_Count(&numberOfMenus);
  pMenuBar->Release();
  for(int i=0;i<numberOfMenus;i++)
  {
   //遍历顶级菜单,如”文件”
   AutoCAD::IAcadMenuGroup* pMenuGroup;
   VARIANT index;
   VariantInit(&index);
   V_VT(&index) = VT_I4;
   V_I4(&index) = i;
   hr=pMenuGroups->Item(index, &pMenuGroup);
   if(FAILED(hr))
   {
    continue;
   }
   if(pMenuGroup==NULL)
   {
    continue;
   }
   BSTR name = ::SysAllocString(L””);
   pMenuGroup->get_Name(&name);
   CString strName=name;
   ::SysFreeString(name);
   if(strName.CompareNoCase(_T(“ACAD”))==0)
   {
    AutoCAD::IAcadPopupMenus* pPopUpMenus;
    hr=pMenuGroup->get_Menus(&pPopUpMenus);
    if(FAILED(hr))
    {
     //释放顶级菜单
     pMenuGroup->Release();
     break;
    }
    long count;
    pPopUpMenus->get_Count(&count);
    for(int j=0;j<count;j++)
    {
     AutoCAD::IAcadPopupMenu* pPopUpMenu;
     V_I4(&index) = j;
     hr=pPopUpMenus->Item(index,&pPopUpMenu);
     if(FAILED(hr))
     {
      continue;
     }
     PopupMenuInfo info;
     GetInfo(info,pPopUpMenu);
     if(info.strTagString.CompareNoCase(_T(“ID_MnFile”))==0)
     {
      //找到文件菜单
      int nIndex=EnumFileMenu(pPopUpMenu);
      if(nIndex>0)
      {
       //增加我们的菜单
       V_I4(&index) =nIndex;
       WCHAR wstrMenuItemName[256]=L”图纸比较”;
       WCHAR wstrMenuItemMacro[256]=L”tzbj “;
       AutoCAD::IAcadPopupMenuItem* pMenuItem;
       pPopUpMenu->AddMenuItem(index, wstrMenuItemName, wstrMenuItemMacro, &pMenuItem);
       OutputDebugStringX(_T(“增加图纸比较菜单:%d”),nIndex);
      }
     }
     pPopUpMenu->Release();
    }
    pPopUpMenus->Release();
    //释放顶级菜单
    pMenuGroup->Release();
    break;

   }
   //释放顶级菜单
   pMenuGroup->Release();
   OutputDebugStringX(_T(“顶级菜单:%s”),strName);
  }
  //释放整个菜单
  pMenuGroups->Release();

  return true;
 }
}

 

//acrxEntryPoint.cpp

#define  MENU_TIMER 45//注意请不要用我一样的ID,否则有可能会重复

#include “GMenu.h”

void CALLBACK TimerProc(HWND hWnd, UINT nMsg, UINT_PTR nTimerId, DWORD dwTime)
{
    KillTimer(hWnd, nTimerId);
    if (!GMenu::AddMenu())
    {
        SetTimer(acedGetAcadFrame()->GetSafeHwnd(), MENU_TIMER, 1000, TimerProc);
    }
}

 

在初始化的时候调用

SetTimer(NULL, MENU_TIMER, 1000, TimerProc);

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

CAD图纸比较专业版注册

图纸比较

每套价格:100元人民币

促销期间:五折优惠(2013年11月27号到2013年12月27号)

                  50元人民币/套

开户银行:中国工商银行上海市分行张江支行

户名:张曙亮

账号:6222021001067962966

或者通过支付宝转账:wdzhangsl@126.com

汇款后将特征码通过邮件或者QQ发送给作者

邮箱:wdzhangsl@126.com

QQ:245804736

获取特征码,一般最多两个工作日即可得到注册码回复。

如遇特殊情况无法联系,可短信通知作者

158*210#89308

去掉*和#号

 

发表在 网站建设 | 标签为 | 留下评论

最新体验版本V1.0.4.20131029

最新体验版本V1.0.4.20131029

增加了”按颜色选择”功能

增加了”多行文字清除格式”功能

增加了”表格对齐”功能

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

最新体验版本V1.0.4.20131024

最新体验版本V1.0.4.20131024

解决了鼠标预览的BUG,切换文档时会崩溃

增加了功能,批量填充,类似于区域搜索

只不过创建出来的是填充。

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

什么样的内容会被百度快速收录

一个小的站点想被百度快速收录是很困难的

没什么人气,也没什么流量

百度就算每天来采集你的网页也不会给你更新你的内容,但是我们还是可以在内容上想点办法

像下面这边文章:

网页调用AutoVue浏览DWG文件

发表于 2013 年 10 月 21 日boitboy

百度在10月22号就收录了

仔细分析了一下这篇文章具备了两个特点

一:原创,有一定的技术含量

二:内容有一定的关心用户,我最初通过百度和谷歌进行了大量搜索均没有搜索到想要的内容,最后自己通过努力解决了。有一定的用户需要这样的内容因此百度收录自然比较快。

不过这样的内容不是每次都能写出来的,没办法,慢慢更新,慢慢来呗。

只要你努力,度娘总有一点认可你,只要你坚持到度娘认可你的那一天

就像一个故事那样,一个男的很喜欢一个女的,每天给女的写一封情书,女的每天给她回一个白条,男的看了十几次是这样看了七八十次还是那样后面就不看了,其实九十九封的时候女孩回了我已经准备好了嫁衣,你愿意娶我吗?可惜男的没看到。哈哈,就看谁能坚持到最后吧。

 

发表在 网站建设 | 标签为 | 留下评论

最新体验版本V1.0.4.20131022

最新体验版本V1.0.4.20131022

增加新功能:

区域搜索

修复了BUG:

鼠标预览在AutoCAD2010及以上版本的32位和64位无效果

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

区域搜索

通过相连或者相交的各种曲线(直线,圆弧,多段线)搜索出闭合面域

1:点击菜单”编辑工具”->”区域搜索”

2:选择实体对象

区域搜索

3:鼠标移动到区域中间

区域搜索

4:出现您需要的填充的时候单击鼠标左键,然后按”Enter”键回车确定

一个闭合的多段线(面域)就创建好了,是不是很方便。

区域搜索

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

CAD的对象捕捉有哪些方式可以设置?CAD对象捕捉有哪些选项?

在AutoCAD或浩辰CAD等类似的CAD软件中,对象捕捉选项并不止捕捉设置对话框里列出来的那些选项,而且有很多种方式来设置捕捉选项,下面给大家简单介绍一下。

对象捕捉是CAD中最为重要的绘图辅助工具,使用对象捕捉可以精确定位,使用户在绘图过程中可直接利用光标来准确地确定目标点,如圆心、端点、重点垂足等等。
在CAD中通常大家都在对象捕捉设置对话框中设置捕捉选项,如下图所示。

 

对象捕捉

捕捉选项都提供一个比较形象的标记,大部分选项都比较好理解,如果对有些选项不太清楚,可以看后面的说明。

设置好这些选项后,只要打开对象捕捉,这些选项会一直起作用。很多人习惯与将所有选项都选上,这样不仅会增加CAD在捕捉时的计算量,同时这些选项之间也会造成相互干扰,所以不建议大家全部选上,建议只勾选端点、交点、中点、圆心等常用选项。

除了用对话框设置固定的对象捕捉选项外,如果我们只是偶尔使用某捕捉方式,还可以通过其他一些方式来设置临时的对象捕捉选项,而且可以设置的选项更多。比如:

(1)使用“ObjectSnap(对象捕捉)”工具栏,如下图所示。

 

对象捕捉

打开对象捕捉工具栏后,在绘图过程中如果临时要使用哪种捕捉方式,可以在工具栏中点对应的图标按钮。同时我们可以注意到工具栏比对话框多两个选项,临时追踪点和捕捉自选项,而且可以点“不捕捉”,临时取消对话框中设置的所有捕捉选项。所谓临时捕捉选项,就是点完按钮用一下,如果这个设置就失效了。

注意:临时捕捉选项必须在定位点时点才起作用,如果未调用任何绘图或编辑命令,没有出现定位点的提示,在对象捕捉工具栏上点按钮是不起作用的,会提示未知命令。

(2)按Shift键的同时单击右键,弹出快捷菜单,如下图所示。

 

对象捕捉

我们可以看到,相对工具栏,这里又增加了三个选项,“两点之间的中点”、“点过滤器”及“三维对象捕捉”。当两点之间没有连线时,利用“两点之间的中点”可以捕捉图中两个点之间的中点。“点过滤器”则可以设置捕捉时只获取某个点的某个坐标值,例如可以只获取一个点的X坐标,然后再获取另一个点的Y坐标。三维对象捕捉中除了常规的捕捉选项外,还有面中心以及最靠近面的选项。

(3)在命令行中输入相应选项的缩写。

在命令提示要定位一个点坐标时,我们可以通过输入对象捕捉选项或参数称缩写来临时调用某个捕捉选项,其参数及缩写如下:

Endpoint(端点):缩写为“END”,用来捕捉对象(如圆弧或直线等)的端点。

Midpoint(中点):缩写为“MID”,用来捕捉对象的中间点(等分点)。

Intersection(交点):缩写为“INT”,用来捕捉两个对象的交点。

ApparentIntersect(外观交点):缩写为“APP”,用来捕捉两个对象延长或投影后的交点。即两个对象没有直接相交时,系统可自动计算其延长后的交点,或者空间异面直线在投影方向上的交点。

Extension(延伸):缩写为“EXT”,用来捕捉某个对象及其延长路径上的一点。在这种捕捉方式下,将光标移到某条直线或圆弧上时,将沿直线或圆弧路径方向上显示一条虚线,用户可在此虚线上选择一点。

Center(圆心):缩写为“CEN”,用于捕捉圆或圆弧的圆心。

Quadrant(象限点):缩写为“QUA”,用于捕捉圆或圆弧上的象限点。象限点是圆上在0°、90°、180°和270°方向上的点。

Tangent(切点):缩写为“TAN”,用于捕捉对象之间相切的点。

Perpendicular(垂足):缩写为“PER”,用于捕捉某指定点到另一个对象的垂点。

Parallel(平行):缩写为“PAR”,用于捕捉与指定直线平行方向上的一点。创建直线并确定第一个端点后,可在此捕捉方式下将光标移到一条已有的直线对象上,该对象上将显示平行捕捉标记,然后移动光标到指定位置,屏幕上将显示一条与原直线相平行的虚线,用户可在此虚线上选择一点。

Node(节点):缩写为“NOD”,用于捕捉点对象。

Insert(插入点):缩写为“INS”,捕捉到块、形、文字、属性或属性定义等对象的插入点。

Nearest(最近点):缩写为“NEA”,用于捕捉对象上距指定点最近的一点。

None(无):缩写为“NON”,不使用对象捕捉。

From(捕捉自):缩写为“FRO”,可与其他捕捉方式配合使用,用于指定捕捉的基点。

Temporarytrackpoint(临时追踪点):缩写为“TT”,可通过指定的基点进行极轴追踪。

两点的中点:缩写为“MTP”“M2P”,可以捕捉两个点的中点。

追踪(Tracking):缩写“TK”,可以捕捉一个基点,然后设置偏移的方向和距离,捕捉距离某一点特定距离的某个点。(这个选项是工具栏、右键菜单中没有的,只能通过输入参数来调用。)

 

 以上使用技巧适用于AutoCAD及浩辰CAD等类似的CAD软件。

发表在 CAD技巧 | 标签为 , | 留下评论

网页调用AutoVue浏览DWG文件

能打开所有3D文件AutoVue SolidModel Pro 19.3中文绿色特别版 能直接打开所有的3D图档 ,包括:ProEngineer、Unigraphics、SolidWorks、Catia、SolidEdge、Autodesk等各种软件的3D文件。支持超过400种不同档案的档案格式,包括2D & 3D、CAD、EDA、office文本

通过下面的代码我们可以在网页中调用AutoVueX.ocx

浏览CAD的DWG文件

<html>
<head>
</head>
<body>
<object id=”xxxx” visible=”true” classid=”CLSID:B6FCC215-D303-11D1-BC6C-0000C078797F” type=”application/x-oleobject” width=”800″ height=”600″>
<param name=”SRC” value=”test.dwg”> 
</object>
</body></html>

注意test.dwg表示需要浏览的DWG文件的路径,支持网络路径

AutoVue19.3下载:http://pan.baidu.com/s/1taCQN

发表在 CAD实用软件 | 标签为 , , | 8条评论

复制图纸空间的视口到另一个dwg文件中

先建立一个模板,把图纸空间初始化,然后wblockcloneobjects到模型
空间(wblock命令也是把对象放到模型空间的,如果wblockcloneobjcts直接放图纸空间,打开视口时cad会崩溃)。
然后再将视口deepclone到图纸空间就OK了

 AcDbDatabase *pDbMid=new AcDbDatabase;
 //建模板dwg文件,先切换到图纸空间,把全局视口建起来
 //每个图纸空间都有一个全局视口,视口下还挂了反应器
 //直接wblockcloneobjects一个new的database的话,会因为没有这个视口而搞得acad崩溃
 //如果想用new的database,要先把这个全局视口建立起来,现在还不知道怎么建难过
 pDbMid->readDwgFile(_T(“c:\\template.dwg”));  //读取模板

 ads_name name;
 ads_point pnt;
 AcDbEntity * pEnt;
 int i;
 Acad::ErrorStatus es;
 
 acedEntSel(_T(“选择一个视口\n”),name,pnt);
 
 AcDbObjectId objId,dicObj;
 acdbGetObjectId(objId,name);
 AcDbObjectIdArray arrID;
 arrID.append(objId);
 
 acedEntSel(_T(“选择一个视口\n”),name,pnt);
 acdbGetObjectId(objId,name);
 arrID.append(objId);

 
 //将扩展字典改为硬拥有,否则写块出去后会丢失
 AcDbObjectId tempObjId;
    for (i=0;i<arrID.length();i++)
    {
  if(Acad::eOk==(es=acdbOpenObject(pEnt,arrID[i],AcDb::kForWrite))){
   AcDbObjectId obj;
   if ((obj = pEnt->extensionDictionary())
    != AcDbObjectId::kNull)
   {
    AcDbDictionary *pDict = NULL;
    acdbOpenObject(pDict, obj, AcDb::kForWrite);
    if (pDict) {
     pDict->setTreatElementsAsHard(Adesk::kTrue);
     pDict->close();
    }
   }
   pEnt->close();
  }
 
    }
   
 AcDbBlockTable *pBT; 
 AcDbObjectId MspaceID,PspaceID,blkObjId;
 pDbMid->getSymbolTable(pBT,AcDb::kForWrite);  
  pBT->getAt(ACDB_MODEL_SPACE,MspaceID);
  pBT->close();

  AcDbIdMapping idMap;
  idMap.setDestDb(pDbMid);
    
 es=pDbMid->wblockCloneObjects(arrID,MspaceID,idMap,AcDb::kDrcIgnore);
   

  AcDbIdPair IdPair;
 AcDbObjectId cloneObjId;

 AcDbIdMapping idMap2;
 AcDbObjectIdArray arrID2; 
 for (i=0;i<arrID.length();i++)  //获取克隆后的对象的objectid
 {
    IdPair.setKey(arrID[i]);
    if (idMap.compute(IdPair))
    {
      arrID2.append(IdPair.value());
    }
      
 }
 
   AcDbSymbolUtilities::getBlockId(PspaceID,ACDB_PAPER_SPACE,pDbMid);
   es=pDbMid->deepCloneObjects( arrID2,PspaceID, idMap2 );  //deepclone视口对象到图纸空间
  
   for (i=0;i<arrID2.length();i++)  //删除原有模型空间的视口对象
   {
    IdPair.setKey(arrID2[i]);
    if (idMap2.compute(IdPair))  //将图纸空间的视口打开
    {
     AcDbObjectPointer<AcDbViewport> EntPtr1(IdPair.value(),AcDb::kForWrite);
     EntPtr1->setOn();
     EntPtr1->close();
    }
   
    AcDbObjectPointer<AcDbViewport> EntPtr2(arrID2[i],AcDb::kForWrite);
    EntPtr2->erase();
    EntPtr2->close();

   }

    pBT->close();
   
 pDbMid->saveAs(_T(“c:\\dddddd.dwg”));

 delete pDbMid;

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

获得当前的视图设置

AcDbViewTableRecord GetCurrentView()
{
AcDbViewTableRecord view;
struct resbuf rb;
struct resbuf wcs, ucs, dcs; // 转换坐标时使用的坐标系统标记

 

wcs.restype = RTSHORT;
wcs.resval.rint = 0;
ucs.restype = RTSHORT;
ucs.resval.rint = 1;
dcs.restype = RTSHORT;
dcs.resval.rint = 2;

 

// 获得当前视口的“查看”模式
acedGetVar(“VIEWMODE”, &rb);
view.setPerspectiveEnabled(rb.resval.rint & 1);
view.setFrontClipEnabled(rb.resval.rint & 2);
view.setBackClipEnabled(rb.resval.rint & 4);
view.setFrontClipAtEye(!(rb.resval.rint & 16));

 

// 当前视口中视图的中心点(UCS坐标)
acedGetVar(“VIEWCTR”, &rb);
acedTrans(rb.resval.rpoint, &ucs, &dcs, 0, rb.resval.rpoint);
view.setCenterPoint(AcGePoint2d(rb.resval.rpoint[X],
   rb.resval.rpoint[Y]));

 

// 当前视口透视图中的镜头焦距长度(单位为毫米)
acedGetVar(“LENSLENGTH”, &rb);
view.setLensLength(rb.resval.rreal);

 

// 当前视口中目标点的位置(以 UCS 坐标表示)
acedGetVar(“TARGET”, &rb);
acedTrans(rb.resval.rpoint, &ucs, &wcs, 0, rb.resval.rpoint);
view.setTarget(AcGePoint3d(rb.resval.rpoint[X],
   rb.resval.rpoint[Y], rb.resval.rpoint[Z]));

// 当前视口的观察方向(UCS)
acedGetVar(“VIEWDIR”, &rb);
acedTrans(rb.resval.rpoint, &ucs, &wcs, 1, rb.resval.rpoint);
view.setViewDirection(AcGeVector3d(rb.resval.rpoint[X],
   rb.resval.rpoint[Y], rb.resval.rpoint[Z]));

 

// 当前视口的视图高度(图形单位)
acedGetVar(“VIEWSIZE”, &rb);
view.setHeight(rb.resval.rreal);
double height = rb.resval.rreal;

 

// 以像素为单位的当前视口的大小(X 和 Y 值)
acedGetVar(“SCREENSIZE”, &rb);
view.setWidth(rb.resval.rpoint[X] / rb.resval.rpoint[Y] * height);

 

// 当前视口的视图扭转角
acedGetVar(“VIEWTWIST”, &rb);
view.setViewTwist(rb.resval.rreal);

 

// 将模型选项卡或最后一个布局选项卡置为当前
acedGetVar(“TILEMODE”, &rb);
int tileMode = rb.resval.rint;
// 设置当前视口的标识码
acedGetVar(“CVPORT”, &rb);
int cvport = rb.resval.rint;

 

// 是否是模型空间的视图
bool paperspace = ((tileMode == 0) && (cvport == 1)) ? true : false;
view.setIsPaperspaceView(paperspace);

if (!paperspace)
{
   // 当前视口中前向剪裁平面到目标平面的偏移量
   acedGetVar(“FRONTZ”, &rb);
   view.setFrontClipDistance(rb.resval.rreal);
  
   // 获得当前视口后向剪裁平面到目标平面的偏移值
   acedGetVar(“BACKZ”, &rb);
   view.setBackClipDistance(rb.resval.rreal);
}
else
{
   view.setFrontClipDistance(0.0);
   view.setBackClipDistance(0.0);
}

 

return view;
}

缺陷是这个方法只能获取当前文档的视图设置,但是,如果我只有一个AcDbDatabase,我想获取它的视图设置就比较麻烦了。

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

NSIS安装完成访问网页

NSIS完成访问网页

如上图效果

代码很简单

!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_FUNCTION Info
!define MUI_FINISHPAGE_SHOWREADME_TEXT “访问CAD工具之家(cadgj.com)”
; 安装完成页面
!insertmacro MUI_PAGE_FINISH
Function Info
ExecShell “open” “http://www.cadgj.com
Functionend

发表在 网站建设 | 标签为 | 留下评论