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

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

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

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

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

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

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

Существует ли в Компасе процедура стыковки?

Автор Мирлан, 27.07.23, 15:55:14

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

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

Мирлан

Стоит задача создать чертеж некой детали, путем стыковки нескольких фрагментов используя api. И у меня вопрос
:
Существует ли в Компасе процедура стыковки? например можно разместить два фрагменты так чтобы они точь в точь друг к другу располагались, это и называется стыковкой или есть отдельная процедура стыковки в Компасе?

Если есть такая процедура то какие методы используются?

Scull_

Через api можно, что угодно состыковать, но нужно видеть, что в итоге должно получиться.

Мирлан

Цитата: Scull_ от 27.07.23, 16:05:00Через api можно, что угодно состыковать, но нужно видеть, что в итоге должно получиться.

Именно вот для стыковки можно использовать функции перемещения фрагментов чтобы они четко прилагались друг другу, но и можно использовать некую процедуру стыковки фрагментов если такое имеется. Я думаю было бы более предпочтительным второе, чтобы было все по правилам, но хочу узнать такое имеется ли вообще?

Scull_

Как Вы делаете вручную, так же можно и через api.

Toptotal

Цитата: Мирлан от 27.07.23, 15:55:14Стоит задача создать чертеж некой детали, путем стыковки нескольких фрагментов используя api. И у меня вопрос
где Вы такие задачи находите.. все проектируют в 3д и с модели автоматом все получают.

Starik

Значит так, всё что находилась ниже я счел не имеющим отношение к обсуждаемому вопросу. Более того всё что там было явно носило провокационный характер с целью вызвать распри между участниками форума. В связи с чем я счел необходимым всё это попросту удалить, а не выносить в какие либо другие темы. Считаю что виновник есть уважаемый Doom. Ему объявляю бан на три дня. Режим - только чтение.
+ Благодарностей: 3

Мирлан

Здравствуйте форумчане! Извиняюсь за то что во время не ответил на ваши отклики.
Хочу открыть подробности. У меня проект который в котором автоматизируются чертежи неких деталей относительно входящих данных, проект довольно большой, но мне сейчас назначили такую задачу которую я написал выше в теме.

Мирлан

Цитата: Toptotal от 27.07.23, 20:09:59где Вы такие задачи находите.. все проектируют в 3д и с модели автоматом все получают.
Работаю в заводе где используют компас для автоматизации чертежей относительно абстрактных моделей деталей...

Мирлан

#8
Цитата: Scull_ от 27.07.23, 17:38:01Как Вы делаете вручную, так же можно и через api.
Да вручную показали как делают стыковку, конструкторы просто вырезают стыкуемый фрагмент и вставляет стыкуемому фрагменту указывая осевую линию и компас их стыкует, но именно как мне сделать такое программно чтобы осевые линии сошлись?

Мирлан


Мне нужно чтобы реализовать стыковку так чтобы у фрагментов четко сошлись осевые линии, если есть в api процедура стыковку было бы очень хорошо... Может кто не будь знает?

Scull_

Вы хотя бы покажите на чём остановились, а то складывается впечатление, что Вы хотите, чтобы за Вас все написали.

Петрович-47

Мирлан, что Вы сами мучаетесь и людей в блуд вводите? Если уж нельзя выкладывать чертежи, так сделайте схематичные схемы... тут фрагмент... тут фрагмент тут осевая... тут осевая просто квадратикамитреугольничками. Надо взять тут пристыковать сюда. Все в картинках.
Тогда у людей будет понимание и может Вам помогут...

Мирлан

Цитата: Петрович-47 от 11.08.23, 08:56:11Мирлан, что Вы сами мучаетесь и людей в блуд вводите? Если уж нельзя выкладывать чертежи, так сделайте схематичные схемы... тут фрагмент... тут фрагмент тут осевая... тут осевая просто квадратикамитреугольничками. Надо взять тут пристыковать сюда. Все в картинках.
Тогда у людей будет понимание и может Вам помогут...

1) http://joxi.ru/l2ZNek7sE7zjl2
Вот картинка детали которая должна получиться после стыковки нескольких фрагментов в одну, здесь оранжевым цветом по середине идет осевая линия о котором говорил. По этой линии мне нужно стыковать фрагменты

2) http://joxi.ru/brRlYZ3SYO7qV2
Здесь на скриншоте указываю на осевые линии по которым мне нужно реализовать стыковку двух фрагментов. Я хочу по начало стыковать только двух фрагментов а потом уже когда наберусь опыта нескольких фрагментов

3) Приложение написана на PHP Фреймворк YII2, могу приложить код если вы пожелаете. 

Мирлан

#13
Цитата: Scull_ от 11.08.23, 07:55:46Вы хотя бы покажите на чём остановились, а то складывается впечатление, что Вы хотите, чтобы за Вас все написали.

Просто у меня проект написан на PHP из за этого не хочу приложить код
class RMetallhose extends Render
{
    use PreRender;

    public $renderPreset = [
        1 => [
            'front' => [
                'angle' => 0,
                'lines' => [
                    'top' => 0,
                    'right' => 0,
                    'bottom' => 0,
                    'left' => 0,
                ],
            ],
        ],
    ];

    public $techReqsBox = [30,0, 220,450];

    public function compas(array $param = [])
    {
        $compas = &$this->compas;
        if ($param['mode'] == 'preview') {
            $this->renderPreview();
        }
        if ($param['mode'] == 'draft') {
            $this->renderPreview();
            $this->renderTable([
                //Legends::МАССА => round(($this->part->m->val ?? '')/1000000,2),
            ]);
            $this->fillTechreqs($compas->doc2d, $compas->obj, $this->techReqsBox[0], $this->techReqsBox[1], $this->techReqsBox[2], $this->techReqsBox[3]);
        }
    }

    public function renderPreview()
    {
        $this->superPreRender();
        $this->linker();
    }

    public function renderKompasType1($aspect, $grpRef = null)
    {
        //МАГИЯ создание переменных(указателей) из массива. Иначе жопа с формулами...((
        foreach ($this->part->props as $name => $prop) {
            $$name = &$prop->val;
        }
        foreach ($this->part->propsCalc as $name => $prop) {
            $$name = &$prop->val;
        }

        $compas = $this->compas;
        $doc = $compas->doc2d;

        $scaleName = $this->renderPreset[$this->part->type->val][$aspect]['scaleName'];
        $scaleNameNum = (int)explode(':', $scaleName)[1];
        $circle = $compas->ksCircle(0, 0, 100 / 2, 1);

        $gs = [];

        //Пробегаемся по всем фрагментавмв массиве
        foreach ($this->part->fragmentsForJoining as $fragmentFullFileName) {
            //Вставляем фрагменты
            $g = $compas->insertFragment([
                'fullFragmentFileName' => $fragmentFullFileName,
                'scaleName' => "2:1",//$scaleName,
                'xBase' => 0,
                'yBase' => 0,
            ]);

            if ($g) {
                $gs[] = new Fragment([], $g, $compas);
            }
        }

        //Вычисляем общую ширину всех фрагментов
        $totalWidth = 0;
        foreach ($gs as $g) {
            $totalWidth = $totalWidth + $g->width;
        }

        $lefX = 0 - ($totalWidth / 2); //левая конечная точка

        //Пробегаемся по всем фрагментом и перемещаем их
        foreach ($gs as $g) {
            $ff = ($lefX + $g->width / 2);
            $g->moveByCenter($ff, 0); //Перемещаем фрагмент
            $lefX = $ff + $g->width / 2;
        }
        //Кастыль не обращать внимение
        if ($circle) {
            $this->compas->doc2d->ksDeleteObj($circle);
        }
    }
}

/**
 * Класс фрагмента
 * @property integer $height
 * @property integer $width
 * @property object $basePoint
 * @property object $topRightPoint
 * @property object $bottomLeftPoint
 */
class Fragment extends BaseObject {
    private $_fragmentRef; //ССылка на фрагмент
    private $_compas; //обьект Компаса
    private $_ksRectParam; //Интерфейс ksRectParam

    public function __construct($config = [], $fragmentRef, $compas)
    {
        $this->_fragmentRef = $fragmentRef;
        $this->_compas = $compas;

        $param = $this->_compas->obj->GetParamStruct(Constants::ko_RectParam);
        $this->_compas->doc2d->ksGetObjGabaritRect($this->_fragmentRef, $param);
        $this->_ksRectParam = $param;

        parent::__construct($config);
    }

    public function moveByBasePoint(float $x, float $y)
    {
        return $this->_compas->doc2d->ksMoveObj($this->_fragmentRef, $x, $y);
    }

    public function getCenterPoint(): stdClass
    {
        $point = new StdClass();
        $point->x = $this->bottomLeftPoint->x + $this->width / 2;
        $point->y = $this->bottomLeftPoint->y + $this->height / 2;

        return $point;
    }

    public function moveByCenter(float $x, float $y)
    {
        $cx = $this->getCenterPoint()->x;
        $cy = $this->getCenterPoint()->y;

        $xBase = $this->basePoint->xBase;
        $yBase = $this->basePoint->yBase;

        $distanceX = abs($xBase) + abs($cx);
        $distanceY = abs($yBase) + abs($cy);

        $dx = ($xBase + $x) + $distanceX * ($xBase < $cx ? -1 : 1);
        $dy = ($yBase + $y) + $distanceY * ($yBase < $cy ? -1 : 1);

        return $this->_compas->doc2d->ksMoveObj($this->_fragmentRef, $dx, $dy);
    }

    public function getWidth()
    {
        return $this->topRightPoint->x - ($this->bottomLeftPoint->x);
    }

    public function getHeight()
    {
        return $this->topRightPoint->y - $this->bottomLeftPoint->y;
    }

    public function getTopRightPoint()
    {
        return $this->_ksRectParam->GetpTop();
    }

    public function getBottomLeftPoint()
    {
        return $this->_ksRectParam->GetpBot();
    }

    public function getBasePoint()
    {
        return $this->getKsInsertFragmentParam()->GetPlace();
    }

    private function getKsInsertFragmentParam()
    {
        $ksInsertFragmentParam = $this->_compas->obj->GetParamStruct(Constants::ko_InsertFragmentParam);
        $this->_compas->doc2d->ksGetObjParam($this->_fragmentRef, $ksInsertFragmentParam, -1);

        return $ksInsertFragmentParam;
    }
}

Валерий Изранов

Цитата: Мирлан от 27.07.23, 15:55:14создать чертеж некой детали, путем стыковки нескольких фрагментов
Обычно и общепринято вначале делать Модель и только потом с нее делать чертежи.

Перед использованием автоматизации очень желательно Модель сделать вручную.

Мирлан

Цитата: Валерий Изранов от 12.08.23, 06:57:02Обычно и общепринято вначале делать Модель и только потом с нее делать чертежи.

Перед использованием автоматизации очень желательно Модель сделать вручную.

Вы под моделью что имеете ввиду? я в терминах Компаса не очень понимаю

Валерий Изранов

Компас это система трехмерного объемного моделирования.
Бывают плоские рисунки, бывает объемная Модель.

Мирлан

Цитата: Валерий Изранов от 12.08.23, 07:14:19Компас это система трехмерного объемного моделирования.
Бывают плоские рисунки, бывает объемная Модель.
В задаче работаем только 2D режиме.

Валерий Изранов

Цитата: Мирлан от 11.08.23, 07:35:23конструкторы просто вырезают ...часть чертежа.. и вставляет ...в другой чертеж... указывая осевую линию и компас их стыкует, но именно как мне сделать такое программно ?
Такое программно лучше не делать совсем.

Мирлан

На данный момент стыкую фрагментов через вычисления их расположения (с помощью ksGetObjGabaritRect) в пространстве и перемещением фрагментов так чтобы они четко прилагались друг другу, но такой способ не реализует стыковку с участием осевой линии (т.е. полноценной стыковки). Может кто не будь знает как все боле менее правильно сделать? Помогите...