二维矢量动画智能制作软件开发合集
个人开发二维矢量动画智能制作软件界面如下:

目录
本篇介绍软件左侧工具栏→绘制工具→删除矢量线段![]()

根据矢量线段在不同形状里所处位置,可将矢量线段划分为:1)封闭形状的线段;2)不封闭形状的线段。
① 对于封闭形状,删除线段操作需要删除:1)本线段;2)封闭形状;3)线段起始节点的曲率控制节点及其手柄;4)线段终止节点的曲率控制节点及其手柄。
② 对于不封闭形状,删除线段操作需要删除:1)本线段;2)封闭形状;3)线段起始节点的曲率控制节点及其手柄;4)线段终止节点的曲率控制节点及其手柄;5)若线段为未封闭形状的起始线段,则删除线段起始节点;6)若线段为未封闭形状的终止线段,则删除线段终止节点。
另,删除后发现需要取消本次删除,则需要引入撤销指令,本软件采用Qt的QUndoStack来实现撤销及重做指令。
.h文件变量申明:
QUndoStack *m_undoStack;
QGraphicsItem *tmp;
- /*【获取undostack】*/
- void Scene::getUndostack(QUndoStack *undoStack)
- {
- m_undoStack = undoStack;
- }
-
- void Scene::mousePressEvent(QGraphicsSceneMouseEvent *mouseEvent)
- {
- m_undoStack->push(new deletePathCmd(qgraphicsitem_cast
(tmp))); - }
(nullptr)
- /*【删除线段】*/
- class deletePathCmd :public QUndoCommand
- {
- public :
- deletePathCmd(QGraphicsItem *lineItem = nullptr);
-
- void redo() override;
- void undo() override;
-
- private:
- QGraphicsItem *m_lineItem;
- bool hasP1 = false,hasP2 = false,hasStroke = false;
- QGraphicsObject *m_p1,*m_p2,*m_c1,*m_c2,*m_strokeSeg,*m_c1Curve,*m_c2Curve;
- QGraphicsItem *m_parentItem,*m_posParentItem,*m_curveParentItem,*m_strokeParentItem;
- QGraphicsScene *m_scene;
- };
-
- /*【删除线段 - 申明】*/
- deletePathCmd::deletePathCmd(QGraphicsItem *lineItem)
- {
- m_lineItem = lineItem;
- m_parentItem = m_lineItem->parentItem();
- m_scene = m_lineItem->scene();
- }
- /*【删除线段 - redo】*/
- void deletePathCmd::redo()
- {
- if(m_lineItem->m_strokeSeg != nullptr)
- {
- hasStroke = true;
- m_strokeSeg = m_lineItem->m_strokeSeg;
- m_strokeParentItem = m_lineItem->m_strokeSeg->parentItem();
- m_scene->removeItem(m_lineItem->m_strokeSeg);
- }
- int num = 0;
- for(int i = 0; i
m_p1->curveG.count(); i++) - if(m_lineItem->m_p1->curveG[i]->isVisible())
- num++;
- if(num == 1)
- {
- hasP1 = true;
- m_p1 = m_lineItem->m_p1;
- m_posParentItem = m_lineItem->m_p1->parentItem();
- m_scene->removeItem(m_lineItem->m_p1);
- }
- num = 0;
- for(int i = 0; i
m_p2->curveG.count(); i++) - if(m_lineItem->m_p2->curveG[i]->isVisible())
- num++;
- if(num == 1)
- {
- hasP2 = true;
- m_p2 = m_lineItem->m_p2;
- m_posParentItem = m_lineItem->m_p2->parentItem();
- m_scene->removeItem(m_lineItem->m_p2);
- }
- m_curveParentItem = m_lineItem->m_c1->parentItem();
- m_c1 = m_lineItem->m_c1;
- m_c2 = m_lineItem->m_c2;
- m_c1Curve = m_lineItem->m_c1->m_curveLine;
- m_c2Curve = m_lineItem->m_c2->m_curveLine;
- m_scene->removeItem(m_c1);
- m_scene->removeItem(m_c1Curve);
- m_lineItem->m_c1->hide();
- m_c1Curve->hide();
- m_scene->removeItem(m_lineItem->m_c2->m_curveLine);
- m_scene->removeItem(m_lineItem->m_c2);
- m_lineItem->m_c2->hide();
- m_c2Curve->hide();
- m_scene->removeItem(m_lineItem);
- m_lineItem->hide();
- m_scene->update();
- }
- /*【删除线段 - undo】*/
- void deletePathCmd::undo()
- {
- m_lineItem->setParentItem(m_parentItem);
- m_lineItem->show();
- m_c1->setParentItem(m_curveParentItem);
- m_c1->show();
- m_c2->setParentItem(m_curveParentItem);
- m_c2->show();
- m_c1Curve->setParentItem(m_curveParentItem);
- m_c1Curve->show();
- m_c2Curve->setParentItem(m_curveParentItem);
- m_c2Curve->show();
- if(hasP1)
- m_p1->setParentItem(m_posParentItem);
- if(hasP2)
- m_p2->setParentItem(m_posParentItem);
- if(hasStroke)
- m_strokeSeg->setParentItem(m_strokeParentItem);
- m_scene->update();
- }
-
封闭图形删除边线
不封闭图形删除边线
删除边线测试
本文简要梳理了软件【删除矢量线段】的实现框架,内容均为原创。
作者文笔水平一般,请大家多多包涵和指正,十分欢迎进一步交流学习。
若需,请联系本人小红书(小红书号:YzLab96),谢谢。
链接: 软件开发及测试所有视频合集见小红书