Ejemplo n.º 1
0
void MgCmdManagerImpl::eraseWnd(const MgMotion* sender)
{
    Box2d snap(sender->view->xform()->getWndRectM());
    std::vector<int> delIds;
    void *it = NULL;
    MgShapes* s = sender->view->shapes();

    for (MgShape* shape = s->getFirstShape(it); shape; shape = s->getNextShape(it)) {
        if (shape->shape()->hitTestBox(snap)) {
            delIds.push_back(shape->getID());
        }
    }
    s->freeIterator(it);

    if (!delIds.empty()
            && sender->view->shapeWillDeleted(s->findShape(delIds.front()))) {
        MgShapesLock locker(MgShapesLock::Remove, sender->view);

        for (std::vector<int>::iterator i = delIds.begin(); i != delIds.end(); ++i) {
            MgShape* shape = s->findShape(*i);
            if (shape && sender->view->removeShape(shape)) {
                shape->release();
            }
        }
        sender->view->regenAll();
    }
}
Ejemplo n.º 2
0
float MgComposite::_hitTest(const Point2d& pt, float tol, Point2d& nearpt,
                            int& segment, bool& inside) const
{
    void* it;
    float mindist = 1e10f;
    Point2d tmpNear;
    int tmpseg;
    bool tmpIn;
    Box2d limits(pt, 2 * tol, 0);

    segment = 0;
    for (MgShape* sp = _shapes->getFirstShape(it); sp;
        sp = _shapes->getNextShape(it))
    {
        if (limits.isIntersect(sp->shapec()->getExtent())) {
            float d = sp->shapec()->hitTest(pt, tol, tmpNear, tmpseg, tmpIn);

            if (mindist > d - _MGZERO) {
                mindist = d;
                nearpt = tmpNear;
                segment = sp->getID();
                inside = tmpIn;
            }
        }
    }
    _shapes->freeIterator(it);

    return mindist;
}
Ejemplo n.º 3
0
float MgComposite::_hitTest(const Point2d& pt, float tol, MgHitResult& res) const
{
    void* it;
    MgHitResult tmpRes;
    Box2d limits(pt, 2 * tol, 0);

    res.segment = 0;
    res.dist = _FLT_MAX;

    for (MgShape* sp = _shapes->getFirstShape(it); sp;
        sp = _shapes->getNextShape(it))
    {
        if (limits.isIntersect(sp->shapec()->getExtent())) {
            float d = sp->shapec()->hitTest(pt, tol, tmpRes);
            if (res.dist > d - _MGZERO)
            {
                res = tmpRes;
                res.dist = d;
                res.segment = sp->getID();
            }
        }
    }
    _shapes->freeIterator(it);

    return res.segment != 0;
}
Ejemplo n.º 4
0
bool MgCmdErase::touchEnded(const MgMotion* sender)
{
    MgShapes* s = sender->view->shapes();
    
    if (!m_delIds.empty()
        && sender->view->shapeWillDeleted(s->findShape(m_delIds.front()))) {
        MgShapesLock locker(s, MgShapesLock::Remove);
        int count = 0;
        
        for (std::vector<int>::iterator it = m_delIds.begin(); it != m_delIds.end(); ++it) {
            MgShape* shape = s->findShape(*it);
            if (shape && sender->view->removeShape(shape)) {
                shape->release();
                count++;
            }
        }
        if (count > 0) {
            sender->view->regen();
        }
    }
    
    m_delIds.clear();
    m_boxsel = false;
    sender->view->redraw(false);
    
    return true;
}
Ejemplo n.º 5
0
MgShape* MgCmdManagerImpl::addImageShape(const MgMotion* sender,
        const char* name, float width, float height)
{
    if (!name || *name == 0 || width < 1 || height < 1)
        return NULL;

    Vector2d size(Vector2d(width, height) * sender->view->xform()->displayToWorld());
    while (fabsf(size.x) > 200.f || fabsf(size.y) > 200.f) {
        size *= 0.95f;
    }
    Box2d rect(sender->view->xform()->getWndRectW() + Vector2d(10.f, -10.f));
    rect = Box2d(rect.leftTop(), rect.leftTop() + size);
    rect *= sender->view->xform()->worldToModel();

    MgShapeT<MgImageShape> shape;
    MgImageShape* imagesp = (MgImageShape*)shape.shape();

    shape.context()->setLineStyle(kGiLineNull);         // 默认没有边框
    shape.context()->setFillColor(GiColor::White());    // 设为实填充,避免在中心无法点中
    imagesp->setName(name);
    imagesp->setRect2P(rect.leftTop(), rect.rightBottom());

    MgShapesLock locker(MgShapesLock::Add, sender->view);
    if (sender->view->shapeWillAdded(&shape)) {
        MgShape* newsp = sender->view->shapes()->addShape(shape);
        sender->view->shapeAdded(newsp);

        sender->view->setNewShapeID(newsp->getID());
        sender->view->cancel(sender);

        return newsp;
    }

    return NULL;
}
Ejemplo n.º 6
0
bool MgGroup::_draw(int mode, GiGraphics& gs, const GiContext& ctx, int segment) const
{
    MgShape* sp = _shapes->findShape(segment);
    if (sp) {
        return sp->draw(mode, gs, ctx.isNullLine() ? NULL : &ctx, -1);
    }
    return __super::_draw(mode, gs, ctx, segment);
}
Ejemplo n.º 7
0
void MgComposite::_transform(const Matrix2d& mat)
{
    void* it;
    for (MgShape* sp = _shapes->getFirstShape(it); sp;
        sp = _shapes->getNextShape(it)) {
        sp->shape()->transform(mat);
    }
    _shapes->freeIterator(it);
}
Ejemplo n.º 8
0
bool MgGroup::_offset(const Vector2d& vec, int segment)
{
    MgShape* sp = _shapes->findShape(segment);

    if (sp && canOffsetShapeAlone(sp)) {
        return sp->shape()->offset(vec, -1);
    }

    return __super::_offset(vec, segment);
}
Ejemplo n.º 9
0
GiContext& GiCoreView::getContext(bool forChange)
{
    if (!forChange) {
        _contextEditing = false;
    }

    MgShape* shape = NULL;
    impl->_cmds->getSelection(impl, 1, &shape, forChange);
    _tmpContext = shape ? *shape->context() : *impl->context();

    return _tmpContext;
}
Ejemplo n.º 10
0
void MgComposite::_update()
{
    void* it;
    _extent.empty();

    for (MgShape* sp = _shapes->getFirstShape(it); sp;
        sp = _shapes->getNextShape(it)) {
        sp->shape()->update();
        _extent.unionWith(sp->shapec()->getExtent());
    }
    _shapes->freeIterator(it);
}
Ejemplo n.º 11
0
bool MgComposite::_draw(int mode, GiGraphics& gs, const GiContext& ctx, int) const
{
    void* it;
    int n = 0;

    for (MgShape* sp = _shapes->getFirstShape(it); sp;
        sp = _shapes->getNextShape(it)) {
        n += sp->draw(mode, gs, ctx.isNullLine() ? NULL : &ctx, -1) ? 1 : 0;
    }
    _shapes->freeIterator(it);

    return n > 0;
}
Ejemplo n.º 12
0
bool MgComposite::_offset(const Vector2d& vec, int)
{
    void* it;
    int n = 0;

    for (MgShape* sp = _shapes->getFirstShape(it); sp;
        sp = _shapes->getNextShape(it)) {
        n += sp->shape()->offset(vec, -1) ? 1 : 0;
    }
    _shapes->freeIterator(it);

    return n > 0;
}
Ejemplo n.º 13
0
bool MgCommandDraw::_click(const MgMotion* sender)
{
    Box2d limits(sender->pointM, mgDisplayMmToModel(10, sender), 0);
    Point2d nearpt;
    MgShape* shape = sender->view->shapes()->hitTest(limits, nearpt);
    
    if (shape) {
        g_newShapeID = shape->getID();
        mgGetCommandManager()->setCommand(sender, "select");
    }
    
    return shape || longPress(sender);
}
Ejemplo n.º 14
0
bool MgCmdErase::click(const MgMotion* sender)
{
    MgShape* shape = hitTest(sender);
    if (shape && sender->view->shapeWillDeleted(shape)) {
        MgShapesLock locker(sender->view->shapes(), MgShapesLock::Remove);
        if (sender->view->removeShape(shape)) {
            shape->release();
            sender->view->regen();
        }
    }
    
    return true;
}
Ejemplo n.º 15
0
bool MgCommandDraw::_click(const MgMotion* sender)
{
    Box2d limits(sender->pointM, sender->displayMmToModel(10.f), 0);
    MgHitResult res;
    MgShape* shape = sender->view->shapes()->hitTest(limits, res);
    
    if (shape) {
        sender->view->setNewShapeID(shape->getID());
        sender->toSelectCommand();
        LOGD("Command (%s) cancelled after the shape #%d clicked.", getName(), shape->getID());
    }
    
    return shape || (sender->view->useFinger() && longPress(sender));
}
Ejemplo n.º 16
0
MgShape* MgCommandDraw::_addshape(const MgMotion* sender, MgShape* shape)
{
    MgShapesLock locker(sender->view->shapes(), MgShapesLock::Add);
    shape = shape ? shape : m_shape;
    MgShape* newsp = NULL;
    
    if (locker.locked() && sender->view->shapeWillAdded(shape)) {
        newsp = sender->view->shapes()->addShape(*shape);
        sender->view->shapeAdded(newsp);
        g_newShapeID = newsp->getID();
    }
    if (m_shape && sender->view->context()) {
        *m_shape->context() = *sender->view->context();
    }
    
    return newsp;
}
Ejemplo n.º 17
0
bool MgCmdErase::touchMoved(const MgMotion* sender)
{
    Box2d snap(sender->startPointM, sender->pointM);
    void *it = NULL;
    MgShape* shape = m_boxsel ? sender->view->shapes()->getFirstShape(it) : NULL;
    
    m_delIds.clear();
    for (; shape; shape = sender->view->shapes()->getNextShape(it)) {
        if (isIntersectMode(sender) ? shape->shape()->hitTestBox(snap)
            : snap.contains(shape->shape()->getExtent())) {
            m_delIds.push_back(shape->getID());
        }
    }
    sender->view->shapes()->freeIterator(it);
    sender->view->redraw(false);
    
    return true;
}
Ejemplo n.º 18
0
MgShape* MgCommandDraw::addShape(const MgMotion* sender, MgShape* shape, bool autolock)
{
    MgShapesLock locker(MgShapesLock::Add, autolock ? sender->view : NULL);
    shape = shape ? shape : m_shape;
    MgShape* newsp = NULL;
    
    if ((locker.locked() || !autolock) && sender->view->shapeWillAdded(shape)) {
        newsp = sender->view->shapes()->addShape(*shape);
        sender->view->shapeAdded(newsp);
        sender->view->getCmdSubject()->onShapeAdded(sender, newsp);
        if (strcmp(getName(), "splines") != 0) {
            sender->view->setNewShapeID(newsp->getID());
        }
    }
    if (m_shape && sender->view->context()) {
        *m_shape->context() = *sender->view->context();
    }
    
    return newsp;
}
Ejemplo n.º 19
0
bool MgCmdErase::draw(const MgMotion* sender, GiGraphics* gs)
{
    if (m_boxsel) {
        GiContext ctxshap(0, GiColor(0, 0, 255, 80), 
                          isIntersectMode(sender) ? kGiLineDash : kGiLineSolid, GiColor(0, 0, 255, 24));
        
        bool antiAlias = gs->setAntiAliasMode(false);
        gs->drawRect(&ctxshap, Box2d(sender->startPointM, sender->pointM));
        gs->setAntiAliasMode(antiAlias);
    }
    
    GiContext ctx(-4, GiColor(64, 64, 64, 128));
    
    for (std::vector<int>::const_iterator it = m_delIds.begin(); it != m_delIds.end(); ++it) {
        MgShape* shape = sender->view->shapes()->findShape(*it);
        if (shape)
            shape->draw(1, *gs, &ctx);
    }
    
    return true;
}
Ejemplo n.º 20
0
MgShape* MgCmdManagerImpl::addImageShape(const MgMotion* sender, const char* name,
                                         float xc, float yc, float w, float h)
{
    if (!name || *name == 0 || w < 1 || h < 1)
        return NULL;
    
    Vector2d size(Vector2d(w, h) * sender->view->xform()->displayToWorld());
    while (fabsf(size.x) > 200.f || fabsf(size.y) > 200.f) {
        size *= 0.95f;
    }
    size *= sender->view->xform()->worldToDisplay();
    
    Box2d rect(xc - size.x / 2, yc - size.y / 2, xc + size.x / 2, yc + size.y / 2);
    LOGD("addImageShape %s x:%.0f y:%.0f w:%.0f h:%.0f", 
         name, rect.xmin, rect.ymin, rect.width(), rect.height());
    rect *= sender->view->xform()->displayToModel();
    
    MgShapeT<MgImageShape> shape;
    MgImageShape* imagesp = (MgImageShape*)shape.shape();
    
    shape.context()->setLineStyle(kGiLineNull);         // 默认没有边框
    shape.context()->setFillColor(GiColor::White());    // 设为实填充,避免在中心无法点中
    imagesp->setName(name);
    imagesp->setRect2P(rect.leftTop(), rect.rightBottom());
    
    MgShapesLock locker(MgShapesLock::Add, sender->view);
    if (sender->view->shapeWillAdded(&shape)) {
        MgShape* newsp = sender->view->shapes()->addShape(shape);
        sender->view->shapeAdded(newsp);
        
        sender->view->setNewShapeID(newsp->getID());
        sender->toSelectCommand();
        
        return newsp;
    }
    
    return NULL;
}
Ejemplo n.º 21
0
bool MgCmdDrawSplines::click(const MgMotion* sender)
{
    if (m_freehand) {
        MgShapeT<MgLine> line(*sender->view->context());
        Point2d pt (sender->pointM);
        
        if (sender->point.distanceTo(sender->startPt) < 1.f) {
            pt = (sender->point + Vector2d(1.f, 1.f)) * sender->view->xform()->displayToModel();
        }
        line.shape()->setPoint(0, sender->startPtM);
        line.shape()->setPoint(1, pt);
        
        MgShape* newsp = addShape(sender, &line);
        if (newsp) {
            dynshape()->shape()->clear();
            sender->view->regenAppend(newsp->getID());
        }
        
        return true;
    }
    
    return MgCommandDraw::click(sender);
}
Ejemplo n.º 22
0
int GiCoreView::addImageShape(const char* name, float width, float height)
{
    MgShape* shape = impl->_cmds->addImageShape(&impl->motion, name, width, height);
    return shape ? shape->getID() : 0;
}
Ejemplo n.º 23
0
Point2d MgComposite::_getPoint(int index) const
{
    MgShape* sp = _shapes->getHeadShape();
    return sp ? sp->shapec()->getPoint(index) : Point2d();
}
Ejemplo n.º 24
0
int MgComposite::_getHandleType(int index) const
{
    MgShape* sp = _shapes->getHeadShape();
    return sp ? sp->shapec()->getHandleType(index) : kMgHandleOutside;
}
Ejemplo n.º 25
0
int MgComposite::_getPointCount() const
{
    MgShape* sp = _shapes->getHeadShape();
    return sp ? sp->shapec()->getPointCount() : 0;
}
Ejemplo n.º 26
0
int GiCoreView::addImageShape(const char* name, float xc, float yc, float w, float h)
{
    MgShape* shape = impl->_cmds->addImageShape(&impl->motion, name, xc, yc, w, h);
    return shape ? shape->getID() : 0;
}