• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Редактирование эскиза

Автор Maxagg, 15.07.09, 08:34:43

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Maxagg

Есть код создания и редактирования эскиза
//создание
  iSketchEntity:=ksentity(part.NewEntity(5));
  if iSketchEntity<>nil then
  SD:=ksSketchDefinition(iSketchEntity.GetDefinition);
  se:=ksEntity(part.GetDefaultEntity(1));
  se.Update;
  sd.SetPlane(se);
  sd.angle:=0; 
  iSketchEntity.Create;
//редактирование начало
  iSketchDoc2D:=ksDocument2D(sd.BeginEdit);

Вопрос: Редактирование происходит в фоновом режиме, а как
открыть эскиз на редактирование, чтобы потом сам руками мог
начертить и закрыть редактирование?


Georg

Попробуй посмотреть ksSystemControlStart и ksSystemControlStop


YorikER

Что-то вроде Lisp в автокаде, вызвал команду, зафиксировал список пауз, во время которых пользователь выполняет операции вручную (ввод данных, указание точки или еще что-нибудь), после окончания списка пауз, управление передается программе... Действительно такой возможности в API вроде нет, по крайней мере я не нашел, а ОЧЕНЬ НАДО!!!

Maxagg

ВОТ МОЙ ОТВЕТ
В Настройках интерфейса установил горячую клавишу на кнопку Эскиз  ctrl+0 (пытался через hook ее найти но не получилось :|)

и написал такой код
var
  kompas:KompasObject;
  d3d:ksDocument3D;
  SD:ksSketchDefinition;
  iReqInfo:ksRequestInfo3D;
  iSketchEntity,se:ksentity;
  iSketchDoc2D,d2d:ksDocument2D;
  part:kspart;
  x,y,da:double;
  TheChildHandle,wnd: HWND;
  str:Pansichar;
  SM:ksSelectionMng;
  iEntityCollection:ksEntityCollection;
procedure TForm1.Button1Click(Sender: TObject);
begin
  try
    kompas:=KompasObject(GetActiveOleObject('Kompas.Application.5'));
    wnd:=kompas.ksGetHWindow;
    GetWindowText(Wnd,str,255);
  except
    exit;
  end;
  kompas.Visible:=true;
  kompas.ActivateControllerAPI;
  d3d:=ksDocument3D(Kompas.ActiveDocument3D);
  SM:=ksSelectionMng(d3d.GetSelectionMng);
  part:=ksPart(d3d.GetPart(-3));
  iReqInfo:=ksRequestInfo3D(D3D.GetRequestInfo(Part));
  iSketchEntity:=ksentity(part.NewEntity(5));
  if iSketchEntity<>nil then
  SD:=ksSketchDefinition(iSketchEntity.GetDefinition);
  iReqInfo.prompt:='Укажите плоскость';
  if d3D.UserGetPlacementAndEntity(1) then
  begin
    iEntityCollection:=ksEntityCollection(iReqInfo.GetEntityCollection);
    if iEntityCollection.GetByIndex(0) <> nil then
    se:=ksentity(iEntityCollection.GetByIndex(0));
  end;
  if se<>nil then
  begin
    se.Update;
    sd.SetPlane(se);
    sd.angle:=0;
    iSketchEntity.Create;
    sm.Select(iSketchEntity);
    BringWindowToTop(wnd);
    sleep(100);
    keybd_event(VK_CONTROL, 0, 0, 0);
    keybd_event($30, 0, 0, 0);
    keybd_event($30, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
    d2d:=ksDocument2D(Kompas.ActiveDocument2D);
    if d2d<>nil then
    d2d.ksCursor(nil,x,y,nil);
    d2d.ksCircle(x,y,10,1);
    keybd_event(VK_CONTROL, 0, 0, 0);
    keybd_event($30, 0, 0, 0);
    keybd_event($30, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0);
  end;
end;

1. Запрашиваю у пользователя указать грань (можно и плоскость)
2. Запрашиваю указать точку
3. Рисую окружность
:)