天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 76|回复: 0

如何判断是否可以从 arx 应用程序调用 lisp 函数?

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
如何判断是否可以从 arx 应用程序调用 lisp 函数?
从 arx 应用程序调用 lisp 函数的主要记录方法是 acedInvoke 函数。为了使用它,需要以下两个条件之一:

该函数的名称形式为 C:XXX,类似于 AutoLisp 用于定义 AutoCAD 命令的名称。
使用 Lisp 函数注册的函数 (vl-acad-defun 'function_name')
如何判断是否至少满足其中一个条件?下面是详细的记录代码

//////////////////////////////////////////////////////////////////////////
// Функция проверяет можно ли вызвать lisp-функцию с заданным именем при
// помощи acedInvoke. Такая функция должна или иметь имя в виде C:XXX,
// или быть зарегистрированной при помощи (vl-acad-defun 'имя_функции)
//////////////////////////////////////////////////////////////////////////
static bool IsLispFuncRegisteredInDocument
(
  AcString funcName, // Имя проверяемой функции
  AcApDocument *ap = curDoc() // Документ, в котором эта
  // функция должна использоваться (по умолчанию текущий документ)
)
{
  bool findFunc = false;
  __int64 ptrCurDoc = __int64(ap);
  AcEdCommandIterator* pCmdItr = NULL;
  AcString cmdName, grpName;
  if (NULL != (pCmdItr = acedRegCmds->iterator()))
  {
    for (;!pCmdItr->done() && !findFunc; pCmdItr->next())
    {
      grpName = pCmdItr->commandGroup();
      cmdName = pCmdItr->command()->localName();
      //////////////////////////////////////////////////////////////////////////
      // Если имя группы имеет формат "*DOC(0xNNNNNNNNNNNNNNN)", то эта группа
      // относится к документу. Чтобы определить к какому именно документу она
      // относится достаточно вычленить шестнадцатеричную строку, преобразовать
      // её в длинное целое и сравнить с адресом документа AcApDocument.
      // В случае совпадения все команды и функции работают
      // в пространстве именно этого документа.
      //////////////////////////////////////////////////////////////////////////
      if (grpName.left(7) == ACRX_T("*DOC(0x"))
      {
        __int64 ptrCmdDoc;
        ACHAR *docStart = const_cast<ACHAR *>(grpName.kACharPtr() + 8), *docEnd = NULL;
        // Преобразуем имя группы в длинное целое
        ptrCmdDoc = _wcstoi64(docStart, &docEnd, 16);
        // Сравниваем адрес переданного документа и адрес документа из имени группы
        if (ptrCmdDoc == ptrCurDoc)
        {
          // Если это lisp-функция, то у неё флаг ACRX_CMD_DEFUN
          Adesk::Int32 flag = pCmdItr->command()->commandFlags();
          if ((flag & ACRX_CMD_DEFUN) && !funcName.compareNoCase(cmdName))
          {
            findFunc = true;
            break;
          }
        }
      }
    }
    delete pCmdItr;
  }
  return findFunc;
}
// Для проверки функции IsLispFuncRegisteredInDocument
static void RivilisCheckRegLispFunc()
{
  AcString sName;
  if (acedGetString(FALSE, ACRX_T("\nУкажите имя функции для проверки: "), sName) != RTNORM)
    return;
  if (sName.isEmpty())
    return;
  acutPrintf(ACRX_T("\n%s %sзарегистрирована для acedInvoke"),
    sName.kACharPtr(), IsLispFuncRegisteredInDocument(sName, curDoc()) ? ACRX_T("") : ACRX_T("не "));
}

 

 

 

 

如何判断是否可以从 arx 应用程序调用 lisp 函数?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 12:32 , Processed in 0.140887 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表