Тема: Как изменить выносную линию у размера?

public static void Main()
        {
            Document doc = Application.DocumentManager.MdiActiveDocument;
            Database db = doc.Database;
            Editor ed = doc.Editor;

            try
            {
                Transaction tr = db.TransactionManager.StartTransaction();
                using (tr)
                {
                    BlockTable bt = (BlockTable)tr.GetObject(db.BlockTableId, OpenMode.ForRead);
                    BlockTableRecord btr = (BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite, false);
                    PromptSelectionOptions pso = new PromptSelectionOptions();
                    pso.MessageForAdding = "\nВыберите размеры: ";

                    SelectionFilter sf = new SelectionFilter(
                        new TypedValue[] { new TypedValue((int)DxfCode.Start, "Dimension") });
                    PromptSelectionResult psr = ed.GetSelection(pso, sf);
                    if (psr.Status != PromptStatus.OK) { return; }
                    foreach (ObjectId objId in psr.Value.GetObjectIds())
                    {
                        Dimension dim = (Dimension)objId.GetObject(OpenMode.ForWrite, false);
                        if (dim.GetType().Name.Equals("RotatedDimension"))
                        {
                            Point3dCollection strp = new Point3dCollection();
                            dim.GetStretchPoints(strp);

                        }// if
                    }// foreach
                    tr.Commit();
                }// tr
            }// try
            catch (System.Exception ex)
            { System.Windows.Forms.MessageBox.Show(ex.Message); }
        }// main

dim.GetStretchPoints(strp); дает мне пять основных точек размера. Других способов получить эти точки я не увидел. А как теперь поменять первые две из них (начальные координаты выносных линий)?
Полгаю, что за это должно отвечать dim.MoveStretchPointsAt(... , но так и не понял как оно работает :(
Может есть другой вариант?
P.S. И еще вопрос - есть ли на .NET аналоги лисповских функций работы с кривыми, а точнее аналог vlax-curve-getClosestPOintTo?

Re: Как изменить выносную линию у размера?

Может хоть подскажите как у примитива менять dxf-значения? Точнее - как пользоваться dxfIn и dxfOut?

Re: Как изменить выносную линию у размера?

Например, горизонтальный размер можно удлинить
в обе стороны на 1000 так:

      dim.MoveStretchPointsAt(new IntegerCollection() { 0 }, new Vector3d(-1000, 0, 0));
      dim.MoveStretchPointsAt(new IntegerCollection() { 1 }, new Vector3d(1000, 0, 0));

Точки с индексами 0 и 1 и есть размерные точки
Вектор определяет смещение этих точек, все просто...

[FONT=Arial]~'J'~[/FONT]

Re: Как изменить выносную линию у размера?

Так вот как это работает :) Спасибо!
Еще бы узнать ответ на второй вопросик... ;)

(изменено: fixo, 28 сентября 2010г. 10:30:13)

Re: Как изменить выносную линию у размера?

Александр Пекшев aka Modis пишет:

P.S. И еще вопрос - есть ли на .NET аналоги лисповских функций работы с кривыми, а точнее аналог vlax-curve-getClosestPOintTo?

Нужно кастить полилинию как Curve и там есть все эти методы

                        Point3d mypoint = new point3d(0,0,0);
                        Curve curv = mypline as Curve;
                        Point3d point_on_curve = curv.GetClosestPointTo(mypoint, false);

И ессно все остальные методы аналогичные vlax-curve-getxxxx

Лучше посмотри пример здесь:

http://through-the-interface.typepad.co … art-1.html

[FONT=Arial]~'J'~[/FONT]

Re: Как изменить выносную линию у размера?

Пробелы в знании постепенно заполняются :) Спасибо

Re: Как изменить выносную линию у размера?

Чтоб не создавать новой темы: сделал такую вот штуковину

.......
Curve curve = line as Curve;
foreach (ObjectId objId in objIds)
            {
                Dimension dim = (Dimension)objId.GetObject(OpenMode.ForWrite, false);
                if (dim.GetType().Name.Equals("RotatedDimension"))
                {
                    Point3dCollection pts = new Point3dCollection();
                    dim.GetStretchPoints(pts);
                    Vector3d firstDirection = pts[0].GetVectorTo(pts[2]);
                    Vector3d vec1 = curve.GetClosestPointTo(pts[0], firstDirection, true).GetVectorTo(pts[0]);
                    dim.MoveStretchPointsAt(new IntegerCollection() { 0 }, vec1);
.......

Как я полагал такая конструкция должна "удлинить" первую размерную линию до отрезка... Но чой-то не получается :(

Re: Как изменить выносную линию у размера?

Александр Пекшев aka Modis пишет:

Vector3d vec1 = curve.GetClosestPointTo(pts[0], firstDirection, true).GetVectorTo(pts[0]);

Проверь значение вектора, в индексах не путаешь?

[FONT=Arial]~'J'~[/FONT]

Re: Как изменить выносную линию у размера?

pts[0] - координата первой размерной точки
curve.GetClosestPointTo(pts[0], firstDirection, true) - эта часть вернет мне точку на кривой (в моем случае - отрезке), ближайшую к точке pts[0] по направлению firstDirection (т.е. - не перпендикуляр). Ну а часть .GetVectorTo(pts[0]) должна мне вернуть вектор от точки на кривой к точке pts[0]. Может я ошибаюсь в своем мнении???

Re: Как изменить выносную линию у размера?

Александр Пекшев aka Modis пишет:

pts[0]  - координата первой размерной точки
curve.GetClosestPointTo(pts[0], firstDirection, true)  - эта часть вернет мне точку на кривой (в моем случае - отрезке), ближайшую к точке pts[0] по направлению  firstDirection  (т.е. - не перпендикуляр). Ну а часть  .GetVectorTo(pts[0])  должна мне вернуть вектор от точки на кривой к точке  pts[0] . Может я ошибаюсь в своем мнении???

Извиняюсь, забыл про топик..
О чем я и говорю, получается ты вычисляешь вектор от точки
pts[0] до точки pts[0]
масло масляно...  :D

[FONT=Arial]~'J'~[/FONT]

(изменено: Александр Пекшев aka Modis, 2 октября 2010г. 00:38:28)

Re: Как изменить выносную линию у размера?

Нееее... получается, я вычисляю вектор от точки, взятой на кривой, являющейся ближайшей к pts[0] до точки pts[0]
Вот так наверное нагляднее

Point3D pp = curve.GetClosestPointTo(pts[0], firstDirection, false);
Vector vec1 = pp.GetVectorTo(pts[0]);

Re: Как изменить выносную линию у размера?

В общем - хрен с ними с векторами! Сделал по другому, что хотел (через пересечение с временным отрезком) и у меня возникло два вопроса:
1. Когда я использую джигу для изменения объекта, то мне одновременно рисуются старый объект и новый. Можно сделать так, чтобы старый не отображался?
2. Подскажите как правильно делать?

Предупреждение "Autodesk.AutoCAD.DatabaseServices.Entity.IntersectWith(Autodesk.AutoCAD.DatabaseServices.Entity, Autodesk.AutoCAD.DatabaseServices.Intersect, Autodesk.AutoCAD.Geometry.Point3dCollection, int, int)" является устаревшим: ""Use the overload taking IntPtr instead."".