void CSSplitter::SetSplitterPos(UINT nPos) { CRect rc; GetClientRect(&rc); ApplyConstraints(nPos, rc.Width()); if (m_SplitterPos != nPos) { m_SplitterPos = nPos; MovePanes(); } }
CRect CSSplitter::GetSplitterRect(UINT SplitterPos) { CRect retRC; GetClientRect(&retRC); ApplyConstraints(SplitterPos, retRC.Width()); if (m_bVertSplitter) { retRC.left += SplitterPos; retRC.right = retRC.left + m_nSplitterWidth; } else { retRC.top += SplitterPos; retRC.bottom = retRC.top + m_nSplitterWidth; } return retRC; }
int main(int argc, char *argv[]) { if ( argc != 3 ) { std::cout<<"usage: "<< argv[0] <<" <input file> <output file>\n"; return 1; } std::ifstream infile(argv[1]); std::ofstream outfile(argv[2]); float poissonRatio, youngModulus; infile >> poissonRatio >> youngModulus; Eigen::Matrix3f D; D << 1.0f, poissonRatio, 0.0f, poissonRatio, 1.0, 0.0f, 0.0f, 0.0f, (1.0f - poissonRatio) / 2.0f; D *= youngModulus / (1.0f - pow(poissonRatio, 2.0f)); infile >> nodesCount; nodesX.resize(nodesCount); nodesY.resize(nodesCount); for (int i = 0; i < nodesCount; ++i) { infile >> nodesX[i] >> nodesY[i]; } int elementCount; infile >> elementCount; for (int i = 0; i < elementCount; ++i) { Element element; infile >> element.nodesIds[0] >> element.nodesIds[1] >> element.nodesIds[2]; elements.push_back(element); } int constraintCount; infile >> constraintCount; for (int i = 0; i < constraintCount; ++i) { Constraint constraint; int type; infile >> constraint.node >> type; constraint.type = static_cast<Constraint::Type>(type); constraints.push_back(constraint); } loads.resize(2 * nodesCount); loads.setZero(); int loadsCount; infile >> loadsCount; for (int i = 0; i < loadsCount; ++i) { int node; float x, y; infile >> node >> x >> y; loads[2 * node + 0] = x; loads[2 * node + 1] = y; } std::vector<Eigen::Triplet<float> > triplets; for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) { it->CalculateStiffnessMatrix(D, triplets); } Eigen::SparseMatrix<float> globalK(2 * nodesCount, 2 * nodesCount); globalK.setFromTriplets(triplets.begin(), triplets.end()); ApplyConstraints(globalK, constraints); Eigen::SimplicialLDLT<Eigen::SparseMatrix<float> > solver(globalK); Eigen::VectorXf displacements = solver.solve(loads); outfile << displacements << std::endl; for (std::vector<Element>::iterator it = elements.begin(); it != elements.end(); ++it) { Eigen::Matrix<float, 6, 1> delta; delta << displacements.segment<2>(2 * it->nodesIds[0]), displacements.segment<2>(2 * it->nodesIds[1]), displacements.segment<2>(2 * it->nodesIds[2]); Eigen::Vector3f sigma = D * it->B * delta; float sigma_mises = sqrt(sigma[0] * sigma[0] - sigma[0] * sigma[1] + sigma[1] * sigma[1] + 3.0f * sigma[2] * sigma[2]); outfile << sigma_mises << std::endl; } return 0; }
void CFastSplitter::MovePanes() { if (m_hWnd == 0) return; ASSERT(m_mode < MOD_Last); CRect rect; GetClientRect(&rect);//GetRelativeRect()); m_RealSplitterPos = m_SplitterPos; ApplyConstraints(m_RealSplitterPos, rect.Width(), rect.Height()); CRect firstRc(rect); CRect secondRc(rect); m_SplitterRect.SetRect(0,0,0,0); if (!m_bVertSplitter) { switch (m_mode) { case MOD_Normal: firstRc.bottom = firstRc.top + m_RealSplitterPos; secondRc.top = firstRc.bottom + m_nSplitterWidth; m_SplitterRect.SetRect(rect.left, firstRc.bottom, rect.right, secondRc.top - 1); break; case MOD_FirstMaximized: firstRc = rect; secondRc.top = secondRc.bottom; break; case MOD_SecondMaximized: firstRc.bottom = firstRc.top; secondRc = rect; break; } } else { switch (m_mode) { case MOD_Normal: firstRc.right = firstRc.left + m_RealSplitterPos; secondRc.left = firstRc.right + m_nSplitterWidth; m_SplitterRect.SetRect(firstRc.right, rect.top, secondRc.left - 1, rect.bottom); break; case MOD_FirstMaximized: firstRc = rect; secondRc.left = secondRc.right; break; case MOD_SecondMaximized: firstRc.right = firstRc.left; secondRc = rect; break; } } if (m_pFPane != NULL) { m_pFPane->SetParent(this); if (firstRc.Width() > 0 && firstRc.Height() > 0) { CRect rc; m_pFPane->GetWindowRect(&rc); ScreenToClient(&rc); if (rc != firstRc || !m_pFPane->IsWindowVisible()) m_pFPane->SetWindowPos(0, firstRc.left, firstRc.top, firstRc.Width(), firstRc.Height(), SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW); } else m_pFPane->ShowWindow(SW_HIDE); } if (m_pFPane != NULL) { m_pSPane->SetParent(this); if (secondRc.Width() > 0 && secondRc.Height() > 0) { CRect rc; m_pSPane->GetWindowRect(&rc); ScreenToClient(&rc); if (rc != secondRc || !m_pSPane->IsWindowVisible()) m_pSPane->SetWindowPos(0, secondRc.left, secondRc.top, secondRc.Width(), secondRc.Height(), SWP_NOACTIVATE | SWP_NOZORDER | SWP_SHOWWINDOW); } else m_pSPane->ShowWindow(SW_HIDE); } }