天气与日历 切换到窄版

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

在现有的对象集和点指示实现类似的轮廓ARX

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
[code]//-> отключаем вывод в окне левых акадовских строк               
                struct resbuf cmdechoVar;
                cmdechoVar.restype = RTSHORT;
                cmdechoVar.resval.rint = 0;
                acedSetVar(_T("cmdecho"), &cmdechoVar);
//<-

                ads_name mas; //если работаем по варианту 2, то пора бы заполнить mas данными и не забыть почиститься в конце функции
                AcGePoint3d p;
                AcGePoint3dArray points;
                ads_name plBoundary, plBoundaryPreviousStep;
                if ( acdbEntLast(plBoundaryPreviousStep) != RTNORM )
                {
                        acutPrintf(_T("\nЧертеж пустой"));
                        return;
                }
                AcDbObjectId id;
                AcDbEntity * pEnt;
                while(acedGetPoint(0,_T("\nВнутренняя точка: "),asDblArray(p)) == RTNORM)
                {
                        points.append(p);
                }
                if(points.length() > 0)
                {
                        for(int i= 0;i<points.length();i++)
                        {
                                /*
                                        предпочтительней второй вариант, т.к. первый постоянно выбирает видимые объекты экрана,
                                        и если точек больше одной, то:
                                                - создаваемые контура будут включаться в последующие наборы, что может привести к неправильной работе команды
                                                - постоянный выбор всех видимых объектов тормозит комп.
                                        так что если надо включить все видимые объекты, то лучше их сразу собрать в mas и потом просто подствалять в команду.
                                */
                                acedCommandS(
                                        RTSTR, _T("_.-boundary"),
                                        RTSTR, _T("_a"), // дополнительные данные
                                        RTSTR, _T("_o"), // тип объекта для контура
                                        RTSTR, _T("_p"), // создаваемый контур будет полилинией
                                        RTSTR, _T("_i"), // нужно ли искать островки
                                        RTSTR, _T("_y"), // нужно, либо _T("_n") - не нужно
                                        RTSTR, _T("_b"), // объекты которые будут участвовать в формировании контуров
                                        /*или 1*/RTSTR, _T("_e"), // это будут все видимые на экране объекты, либо вместо этого варианта выбрать /*2*/
                                        /*или 2
                                        RTSTR, _T("_n"), // новый набор
                                        RTPICKS, mas, // указываем ads_name объектов, которые будут участвовать в команде
                                        RTSTR, _T(""),// подтверждение
                                        */
                                        RTSTR,_T(""), // возвращаемся к указанию точки
                                        RTPOINT, asDblArray(points.at(i)), // наша точка, указанная пользователем
                                        RTSTR,_T(""), // подтверждаем ввод точки
                                        RTNONE // конец команды
                                        );

                                acdbEntLast(plBoundary);
                                if (plBoundaryPreviousStep[0] == plBoundary[0] && plBoundaryPreviousStep[1] == plBoundary[1])
                                {
                                        acutPrintf(_T("  %d-я точка поганая\n"),i+1);
                                        continue;
                                }
                                // перекинули последний добавленный в акад объект
                                plBoundaryPreviousStep[0] = plBoundary[0];
                                plBoundaryPreviousStep[1] = plBoundary[1];

                                ::acdbGetObjectId(id,plBoundary);
                                if(acdbOpenObject(pEnt,id,AcDb::kForWrite) == Acad::eOk)
                                {
                                        pEnt->setColorIndex(i+1);
                                        pEnt->downgradeOpen();
                                        pEnt->draw();
                                        pEnt->close();
                                }
                        }
                }

//-> возвращаем все в зад :)
                cmdechoVar.resval.rint = 1;
                acedSetVar(_T("cmdecho"), &cmdechoVar);
//<-[/code]

 

 

 

 

在现有的对象集和点指示实现类似的轮廓ARX
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-1 15:29 , Processed in 0.155041 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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