Тема: Нажатие кнопок в Jig...
Не подскажите что рыть что бы понять как отследить в Sampler
нажатие кнопок, хоть и идет запрос в нем на точку...
PromptPointResult dres = prompts.AcquirePoint(jigOpts);
Хочу динамически точку привязки сменить...
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → .NET → Нажатие кнопок в Jig...
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Не подскажите что рыть что бы понять как отследить в Sampler
нажатие кнопок, хоть и идет запрос в нем на точку...
PromptPointResult dres = prompts.AcquirePoint(jigOpts);
Хочу динамически точку привязки сменить...
Например в режиме Jig (запрос точки)
нажимаю на кнопки "1" или кнопки "2".
Выставить что нить типа
if (dres.Value == "1") ...
и обработать
НО не выходит Акад упорно ждет точку на входе... -(
А в jigOpt ты указал строку ключевых слов и/или флаг UserInputControls.AcceptOtherInputString?
Как раз пытаюсь -) список появляетса но не реагирует на ввод...
...
| UserInputControls.AcceptOtherInputString);
...
jigOpts.Keywords.Add("1");
jigOpts.Keywords.Add("2");
PromptPointResult dres = prompts.AcquirePoint(jigOpts);
if (dres.Value.ToString() == "1")
{
Вроде как уловил -)
...
if (dres.Status == PromptStatus.Keyword)
{
if (dres.StringResult == "1")
{
Вроде как улови -)
if (dres.Status == PromptStatus.Keyword)
{
if (dres.StringResult == "1")
{
//....... protected override SamplerStatus Sampler(JigPrompts prompts) { AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; JigPromptPointOptions jigOpts = new JigPromptPointOptions(); jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted); jigOpts.Message = "\nEnter insert point: "; jigOpts.Keywords.Add("1"); jigOpts.Keywords.Add("2"); jigOpts.Keywords.Add("3"); PromptPointResult dres = prompts.AcquirePoint(jigOpts); if (dres.Status == PromptStatus.Keyword) { ed.WriteMessage("\nResult={0}",dres.StringResult); } else if (mActualPoint.DistanceTo(dres.Value) <= FUZZ) { return SamplerStatus.NoChange; } else { mActualPoint = dres.Value; } return SamplerStatus.OK; } //.......
Но тут есть заминка команда прекращает свое выполнение, мне надо прекращение только если точка введна, при чем прекращает выполнение даже если
...
if (dres.StringResult == "1")
{
return SamplerStatus.NoChange;
и удален флаг AcceptOtherInputString
Спасибо Александр, набросал тоже, но прекращает выполнение функция... -( а мне б надоб что бы только по точке
почему то return SamplerStatus.NoChange;
не выполняетса...
//--------------------------------- protected override SamplerStatus Sampler(JigPrompts prompts) { AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; JigPromptPointOptions jigOpts = new JigPromptPointOptions(); jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted); jigOpts.Message = "\nEnter insert point: "; jigOpts.Keywords.Add("1"); jigOpts.Keywords.Add("2"); jigOpts.Keywords.Add("3"); PromptPointResult dres; do { dres = prompts.AcquirePoint(jigOpts); if (dres.Status == PromptStatus.Keyword) { ed.WriteMessage("\nResult={0}",dres.StringResult); } else if (mActualPoint.DistanceTo(dres.Value) <= FUZZ) { return SamplerStatus.NoChange; } else { mActualPoint = dres.Value; return SamplerStatus.OK; } } while (dres.Status == PromptStatus.Keyword); return SamplerStatus.OK; } //---------------------------------
А так будет правильнее:
static string nPoint = "1"; protected override SamplerStatus Sampler(JigPrompts prompts) { AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; JigPromptPointOptions jigOpts = new JigPromptPointOptions(); jigOpts.Keywords.Add("1"); jigOpts.Keywords.Add("2"); jigOpts.Keywords.Add("3"); jigOpts.Keywords.Add("4"); jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted); PromptPointResult dres; do { jigOpts.Message = "\nEnter insert point <" + nPoint + ">: "; dres = prompts.AcquirePoint(jigOpts); if (dres.Status == PromptStatus.Keyword) { // ed.WriteMessage("\nResult={0}",dres.StringResult); nPoint = dres.StringResult; } else { if (dres.Status == PromptStatus.None) { return SamplerStatus.Cancel; } else { if (mActualPoint.DistanceTo(dres.Value) <= FUZZ) { return SamplerStatus.NoChange; } else { mActualPoint = dres.Value; return SamplerStatus.OK; } } } } while (dres.Status != PromptStatus.Error && dres.Status != PromptStatus.Cancel); return SamplerStatus.OK; }
А что именно странно? Вроде все очевидно...
Да -) но пустой цикл приходитса гонять -) хотя по логике NoChange, должна нас избавить от этого.
А точка привязки у ДЖИГ не меняетса ? что то я не найду как ее поменять , или всегда нижний левый угол ?
> Mx
Первую строку оставлю без коментария - ты не понял логику работы метода Sampler.
А точку привязки ты можешь поменять без проблем. Только разберись с логикой.
Нет уж позвольте -)))))))) в АРХ есть диаграмка в которой черным по белому нарисован и так пустой цикл по параметру NoChange...
и если я принудительно его ставлю то он должен выполнитса...
static bool nChanged = false; static string nPoint = "1"; protected override SamplerStatus Sampler(JigPrompts prompts) { AcEd.Editor ed = AcAp.Application.DocumentManager.MdiActiveDocument.Editor; JigPromptPointOptions jigOpts = new JigPromptPointOptions(); jigOpts.Keywords.Add("1"); jigOpts.Keywords.Add("2"); jigOpts.Keywords.Add("3"); jigOpts.Keywords.Add("4"); jigOpts.Keywords.Add("5"); jigOpts.UserInputControls = (UserInputControls.Accept3dCoordinates | UserInputControls.NoZeroResponseAccepted | UserInputControls.NoNegativeResponseAccepted); PromptPointResult dres; do { jigOpts.Message = "\nEnter insert point <" + nPoint + ">: "; dres = prompts.AcquirePoint(jigOpts); if (dres.Status == PromptStatus.Keyword) { // ed.WriteMessage("\nResult={0}",dres.StringResult); nPoint = dres.StringResult; nChanged = true; } else { if (dres.Status == PromptStatus.None) { return SamplerStatus.Cancel; } else { if (mActualPoint.DistanceTo(dres.Value) <= FUZZ) { return SamplerStatus.NoChange; } else { mActualPoint = dres.Value; return SamplerStatus.OK; } } } } while (dres.Status != PromptStatus.Error && dres.Status != PromptStatus.Cancel); return SamplerStatus.OK; } protected override bool Update() { mCenterPt = mActualPoint; BlockReference bRef = GetEntity() as BlockReference; Extents3d ext = bRef.GeometricExtents; double x = (ext.MaxPoint-ext.MinPoint).X; double y = (ext.MaxPoint-ext.MinPoint).Y; if (bRef != null && (bRef.Position.DistanceTo(mCenterPt) > FUZZ || nChanged)) { nChanged = false; switch (nPoint) { case "2": bRef.Position = mCenterPt + new Vector3d(0,-y/2,0); break; case "3": bRef.Position = mCenterPt + new Vector3d(+x/2,0,0); break; case "4": bRef.Position = mCenterPt + new Vector3d(0,+y/2,0); break; case "5": bRef.Position = mCenterPt + new Vector3d(-x/2,0,0); break; default: bRef.Position = mCenterPt; break; } return true; } else { return false; } }
Александр -) сразу же наровите отделатса примеров -) вместо диалога -)))
Я по предыдущим вашим постам загрузил ДОКУ АКАД и прочитал целиком статейку в АРХ на ДЖИГ с диаграмкрой. И как я понял цикл там есть -)
ПС. Спасибо за пример, я понял что надо пересетить координаты , что привязка имеет свою систему координаты, у меня face.
> Mx
Я всегда предпочитаю конкретные работающие примеры, а не пустую болтовню ("диалог"). Так вот в примерах с ключевыми словами цикл есть.
А возможно в ввод 1.2.3.... внести динамику, что бы не вводить а только нажимать эти символы ? -)
ПС. Меня удивляет Ваша динамика, я другой раз даже хелп не успеваю загрузить -)
> Mx
Какую динамику? Что такое "что бы не вводить а только нажимать эти символы?"?
P.S.: Мне, честно говоря, начало надоедать угадывать что тебе нужно...
В командной строке не нажимать 1<Enter>,
а просто нажать 1 (без Enter).
Мне каждый раз приходится вводить значение.
> Mx
Так нельзя. Но можно через контекстное меню (по правой кнопке мыши).
Добрый вечер. Подскажите, как перерисовать Entity (в моем случае таблицу) в методе Sampler?
Мне нужно организовать возможность менять масштаб таблицы при ее вставке.
Вот, что пока сделал:
protected override SamplerStatus Sampler(JigPrompts prompts) { JigPromptPointOptions ppopt = new JigPromptPointOptions("Укажите точку вставки таблицы"); ppopt.Keywords.Add("1"); ppopt.Keywords.Add("5"); ppopt.Keywords.Add("10"); ppopt.Keywords.Add("15"); ppopt.Keywords.Add("50"); ppopt.Keywords.Add("100"); ppopt.Keywords.Add("200"); PromptPointResult ppres; do { ppres = prompts.AcquirePoint(ppopt); switch (ppres.Status) { case PromptStatus.Cancel: return SamplerStatus.Cancel; break; case PromptStatus.Keyword: _scale = double.Parse(ppres.StringResult); // //Изменить масштаб таблицы и перерисовать? //... break; case PromptStatus.OK: if (_cpos.DistanceTo(ppres.Value) < 0.001) { return SamplerStatus.NoChange; } break; } } while (ppres.Status == PromptStatus.Keyword ); _cpos = ppres.Value; return SamplerStatus.OK; }
Ни keyword запросы, ни jig раньше не делал.
А по идее, должно быть просто.
Почти то, что мне нужно, происходит при стандартной вставке блока (_insert), только там можно выбрать ключевое слово масштаб и в доп.запросе ввести число масштаба. После чего, блок масштабируется и продолжается запрос указания точки.
И еще, мне тоже не понятно, что дает SamplerStatus.NoChanges. Из диаграммы (Drag Loop, в док. ObjectArx) следует, как я понимаю, повторение запроса. Т.е. если не возвращать NoChanges, то примитив будет обновлятся (перерисовываться) постоянно, даже если курсор на месте будет находится. Кажись дошло.
upd
Вопрос решил. Неуверен, что на 100% верно.
В самплере нужно просто запоминать выбранный масштаб. А в апдейте масштабировать таблицу.
Я неверно делел масштаб таблицы. Table.ScaleFactors не меняет масштаб таблицы. Нужно делать TransformBy (Matrix3d.Scaling(scale/oldscale, table.Position).
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → .NET → Нажатие кнопок в Jig...
Форум работает на PunBB, при поддержке Informer Technologies, Inc