Merge branch 'master' of ssh://git.code.sf.net/p/free-cad/code

This commit is contained in:
Yorik van Havre
2014-09-17 14:20:07 -03:00
5 changed files with 145 additions and 80 deletions

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -1,21 +1,23 @@
/* XPM */
static char * Constraint_Symmetric_sm_xpm[] = {
"16 16 2 1",
static char * Constraint_Symmetric_small_1_16px_xpm[] = {
"16 16 4 1",
" c None",
". c #F12000",
". c #FF2500",
"+ c #FF2600",
"@ c #FF2700",
" ",
" ",
" ",
" .. .. ",
" ... .... ",
" ..... ..... ",
" ..... ..... ",
" .... ..... ",
" ... .... ",
" ..... .... ",
" ..... ..... ",
" .... .... ",
" ... ... ",
" . .. ",
" . + ",
" +. ++ ",
" +++ +++ ",
" ++++ +++++ ",
" +++ +++ ",
" ++ ++ ",
" +++ ++++ ",
" ++++ ++++ ",
" +++ +++ ",
" +@ + ",
" ",
" ",
" "};

View File

@@ -56,6 +56,8 @@
#include "SoDatumLabel.h"
#include <Gui/BitmapFactory.h>
#define ZCONSTR 0.006f
using namespace SketcherGui;
// ------------------------------------------------------
@@ -338,8 +340,8 @@ void SoDatumLabel::generatePrimitives(SoAction * action)
SoState *state = action->getState();
const SbViewVolume & vv = SoViewVolumeElement::get(state);
float scale = vv.getWorldToScreenScale(SbVec3f(0.f,0.f,0.f), 1.0f);
SbVec2s vp_size = static_cast<SoGLRenderAction*>(action)->getViewportRegion().getWindowSize();
scale /= float(vp_size[0]);
SbVec2s vp_size = SoViewportRegionElement::get(state).getWindowSize();
scale /= float(vp_size[0]);
SbVec3f dir = (p2-p1);
dir.normalize();
@@ -349,14 +351,14 @@ void SoDatumLabel::generatePrimitives(SoAction * action)
// Calculate coordinates for the first arrow
SbVec3f ar0, ar1, ar2;
ar0 = p1 + dir * 5 * margin;
ar0 = p1 + dir * 5 * margin ;
ar1 = ar0 - dir * 0.866f * 2 * margin; // Base Point of Arrow
ar2 = ar1 + norm * margin; // Triangular corners
ar1 -= norm * margin;
// Calculate coordinates for the second arrow
SbVec3f ar3, ar4, ar5;
ar3 = p2 - dir * 5 * margin;
ar3 = p2 - dir * 5 * margin ;
ar4 = ar3 + dir * 0.866f * 2 * margin; // Base Point of 2nd Arrow
ar5 = ar4 + norm * margin; // Triangular corners
@@ -458,6 +460,14 @@ void SoDatumLabel::GLRender(SoGLRenderAction * action)
this->imgHeight = scale * (float) (srch);
this->imgWidth = aspectRatio * (float) this->imgHeight;
}
if (this->datumtype.getValue() == SYMMETRIC) {
// For the symmetry constraint that does not have text, but does have arrows
//this->imgHeight = 3.36f;
//this->imgWidth = 5.26f;
this->imgHeight = 1.5f;
this->imgWidth = 1.5f;
}
// Get the points stored in the pnt field
const SbVec3f *pnts = this->pnts.getValues(0);
@@ -823,14 +833,14 @@ void SoDatumLabel::GLRender(SoGLRenderAction * action)
ar1 = ar0 - dir * 0.866f * 2 * margin;
ar2 = ar1 + norm * margin;
ar1 -= norm * margin;
glBegin(GL_LINES);
glVertex2f(p1[0],p1[1]);
glVertex2f(ar0[0],ar0[1]);
glVertex2f(ar0[0],ar0[1]);
glVertex2f(ar1[0],ar1[1]);
glVertex2f(ar0[0],ar0[1]);
glVertex2f(ar2[0],ar2[1]);
glVertex3f(p1[0], p1[1], ZCONSTR);
glVertex3f(ar0[0], ar0[1], ZCONSTR);
glVertex3f(ar0[0], ar0[1], ZCONSTR);
glVertex3f(ar1[0], ar1[1], ZCONSTR);
glVertex3f(ar0[0], ar0[1], ZCONSTR);
glVertex3f(ar2[0], ar2[1], ZCONSTR);
glEnd();
// Calculate coordinates for the second arrow
@@ -841,12 +851,12 @@ void SoDatumLabel::GLRender(SoGLRenderAction * action)
ar4 -= norm * margin;
glBegin(GL_LINES);
glVertex2f(p2[0],p2[1]);
glVertex2f(ar3[0],ar3[1]);
glVertex2f(ar3[0], ar3[1]);
glVertex2f(ar4[0], ar4[1]);
glVertex2f(ar3[0], ar3[1]);
glVertex2f(ar5[0], ar5[1]);
glVertex3f(p2[0], p2[1], ZCONSTR);
glVertex3f(ar3[0], ar3[1], ZCONSTR);
glVertex3f(ar3[0], ar3[1], ZCONSTR);
glVertex3f(ar4[0], ar4[1], ZCONSTR);
glVertex3f(ar3[0], ar3[1], ZCONSTR);
glVertex3f(ar5[0], ar5[1], ZCONSTR);
glEnd();
// BOUNDING BOX CALCULATION - IMPORTANT

View File

@@ -256,10 +256,10 @@ ViewProviderSketch::ViewProviderSketch()
PointSize.setValue(4);
zCross=0.001f;
zConstr=0.003f; // constraint not construction
zLines=0.005f;
zHighLine=0.006f;
zPoints=0.007f;
zConstr=0.006f; // constraint not construction
zHighLine=0.007f;
zPoints=0.008f;
zHighlight=0.009f;
zText=0.011f;
zEdit=0.001f;
@@ -452,8 +452,6 @@ void ViewProviderSketch::getProjectingLine(const SbVec2s& pnt, const Gui::View3D
if (!pCam) return;
SbViewVolume vol = pCam->getViewVolume();
float focalDist = pCam->focalDistance.getValue();
vol.projectPointToLine(SbVec2f(pX,pY), line);
}
@@ -1485,7 +1483,9 @@ std::set<int> ViewProviderSketch::detectPreselectionConstr(const SoPickedPoint *
} else {
// Assume second icon was hit
constrIds = static_cast<SoInfo *>(sep->getChild(CONSTRAINT_SEPARATOR_INDEX_SECOND_CONSTRAINTID));
if(CONSTRAINT_SEPARATOR_INDEX_SECOND_CONSTRAINTID<sep->getNumChildren()){
constrIds = static_cast<SoInfo *>(sep->getChild(CONSTRAINT_SEPARATOR_INDEX_SECOND_CONSTRAINTID));
}
}
if(constrIds) {
QString constrIdsStr = QString::fromAscii(constrIds->string.getValue().getString());
@@ -2266,6 +2266,33 @@ void ViewProviderSketch::drawConstraintIcons()
thisIcon.position = absPos;
thisIcon.destination = coinIconPtr;
thisIcon.infoPtr = infoPtr;
if((*it)->Type==Symmetric) {
Base::Vector3d startingpoint = getSketchObject()->getPoint((*it)->First,(*it)->FirstPos);
Base::Vector3d endpoint = getSketchObject()->getPoint((*it)->Second,(*it)->SecondPos);
double x0,y0,x1,y1;
SbVec3f pos0(startingpoint.x,startingpoint.y,startingpoint.z);
SbVec3f pos1(endpoint.x,endpoint.y,endpoint.z);
Gui::MDIView *mdi = Gui::Application::Instance->activeDocument()->getActiveView();
Gui::View3DInventorViewer *viewer = static_cast<Gui::View3DInventor *>(mdi)->getViewer();
SoCamera* pCam = viewer->getCamera();
if (!pCam) return;
SbViewVolume vol = pCam->getViewVolume();
getCoordsOnSketchPlane(x0,y0,pos0,vol.getProjectionDirection());
getCoordsOnSketchPlane(x1,y1,pos1,vol.getProjectionDirection());
thisIcon.iconRotation = -atan2f((y1-y0),(x1-x0))*180/M_PI;
}
else {
thisIcon.iconRotation = 0;
}
if(multipleIcons) {
if((*it)->Name.empty())
@@ -2313,39 +2340,46 @@ void ViewProviderSketch::combineConstraintIcons(IconQueue iconQueue)
// A group starts with an item popped off the back of our initial queue
IconQueue thisGroup;
thisGroup.push_back(iconQueue.back());
ViewProviderSketch::constrIconQueueItem init = iconQueue.back();
iconQueue.pop_back();
// we group only icons not being Symmetry icons, because we want those on the line
if(init.type != QString::fromLatin1("small/Constraint_Symmetric_sm")){
IconQueue::iterator i = iconQueue.begin();
while(i != iconQueue.end()) {
bool addedToGroup = false;
for(IconQueue::iterator j = thisGroup.begin();
j != thisGroup.end(); ++j)
if(i->position.equals(j->position, maxDistSquared) && (*i).type != QString::fromLatin1("small/Constraint_Symmetric_sm")) {
// Found an icon in iconQueue that's close enough to
// a member of thisGroup, so move it into thisGroup
thisGroup.push_back(*i);
i = iconQueue.erase(i);
addedToGroup = true;
break;
}
IconQueue::iterator i = iconQueue.begin();
while(i != iconQueue.end()) {
bool addedToGroup = false;
for(IconQueue::iterator j = thisGroup.begin();
j != thisGroup.end(); ++j)
if(i->position.equals(j->position, maxDistSquared)) {
// Found an icon in iconQueue that's close enough to
// a member of thisGroup, so move it into thisGroup
thisGroup.push_back(*i);
i = iconQueue.erase(i);
addedToGroup = true;
break;
}
if(addedToGroup) {
if(i == iconQueue.end())
// We just got the last icon out of iconQueue
break;
else
// Start looking through the iconQueue again, in case
// we have an icon that's now close enough to thisGroup
i = iconQueue.begin();
} else
++i;
if(addedToGroup) {
if(i == iconQueue.end())
// We just got the last icon out of iconQueue
break;
else
// Start looking through the iconQueue again, in case
// we have an icon that's now close enough to thisGroup
i = iconQueue.begin();
} else
++i;
}
}
if(thisGroup.size() == 1)
if(thisGroup.size() == 1) {
drawTypicalConstraintIcon(thisGroup[0]);
else
}
else {
drawMergedConstraintIcons(thisGroup);
}
}
}
@@ -2373,6 +2407,7 @@ void ViewProviderSketch::drawMergedConstraintIcons(IconQueue iconQueue)
QColor iconColor;
QList<QColor> labelColors;
int maxColorPriority;
double iconRotation;
ConstrIconBBVec boundingBoxes;
while(!iconQueue.empty()) {
@@ -2388,6 +2423,7 @@ void ViewProviderSketch::drawMergedConstraintIcons(IconQueue iconQueue)
iconColor = constrColor(i->constraintId);
labelColors.clear();
labelColors.append(iconColor);
iconRotation= i->iconRotation;
maxColorPriority = constrColorPriority(i->constraintId);
@@ -2439,6 +2475,7 @@ void ViewProviderSketch::drawMergedConstraintIcons(IconQueue iconQueue)
iconColor,
labels,
labelColors,
iconRotation,
&boundingBoxesVec,
&lastVPad);
} else {
@@ -2447,6 +2484,7 @@ void ViewProviderSketch::drawMergedConstraintIcons(IconQueue iconQueue)
iconColor,
labels,
labelColors,
iconRotation,
&boundingBoxesVec,
&thisVPad);
@@ -2507,6 +2545,7 @@ QImage ViewProviderSketch::renderConstrIcon(const QString &type,
const QColor &iconColor,
const QStringList &labels,
const QList<QColor> &labelColors,
double iconRotation,
std::vector<QRect> *boundingBoxes,
int *vPad)
{
@@ -2527,17 +2566,21 @@ QImage ViewProviderSketch::renderConstrIcon(const QString &type,
if(vPad)
*vPad = pxBelowBase;
QImage image = icon.copy(0, 0, icon.width() + labelWidth,
icon.height() + pxBelowBase);
QTransform rotation;
rotation.rotate(iconRotation);
QImage roticon = icon.transformed(rotation);
QImage image = roticon.copy(0, 0, roticon.width() + labelWidth,
roticon.height() + pxBelowBase);
// Make a bounding box for the icon
if(boundingBoxes)
boundingBoxes->push_back(QRect(0, 0, icon.width(), icon.height()));
boundingBoxes->push_back(QRect(0, 0, roticon.width(), roticon.height()));
// Render the Icons
QPainter qp(&image);
qp.setCompositionMode(QPainter::CompositionMode_SourceIn);
qp.fillRect(icon.rect(), iconColor);
qp.fillRect(roticon.rect(), iconColor);
// Render constraint label if necessary
if (!labels.join(QString()).isEmpty()) {
@@ -2589,7 +2632,8 @@ void ViewProviderSketch::drawTypicalConstraintIcon(const constrIconQueueItem &i)
QImage image = renderConstrIcon(i.type,
color,
QStringList(i.label),
QList<QColor>() << color);
QList<QColor>() << color,
i.iconRotation);
i.infoPtr->string.setValue(QString::number(i.constraintId).toAscii().data());
sendConstraintIconToCoin(image, i.destination);

View File

@@ -32,7 +32,6 @@
#include <boost/signals.hpp>
#include <QCoreApplication>
class TopoDS_Shape;
class TopoDS_Face;
class SoSeparator;
@@ -282,6 +281,9 @@ protected:
/// Pointer to SoInfo object where we store the constraint IDs that the icon refers to
SoInfo *infoPtr;
/// Angle to rotate an icon
double iconRotation;
};
/// Internal type used for drawing constraint icons
@@ -304,6 +306,7 @@ protected:
const QColor &iconColor,
const QStringList &labels,
const QList<QColor> &labelColors,
double iconRotation,
//! Gets populated with bounding boxes (in icon
//! image coordinates) for the icon at left, then
//! labels for different constraints.