bool GripperSelTransform::OnGripperGrabbed(const std::list<HeeksObj*>& list, bool show_grippers_on_drag, double* from){ m_initial_grip_pos[0] = m_data.m_x; m_initial_grip_pos[1] = m_data.m_y; m_initial_grip_pos[2] = m_data.m_z; memcpy(m_from, from, 3*sizeof(double)); memcpy(m_last_from, from, 3*sizeof(double)); wxGetApp().m_marked_list->gripping = true; m_items_marked_at_grab.clear(); std::list<HeeksObj *>::const_iterator It; for(It = list.begin(); It != list.end(); It++){ m_items_marked_at_grab.push_back(*It); wxGetApp().m_marked_list->set_ignore_onoff(*It, true); } if ( m_data.m_type <= GripperTypeObjectScaleXY ) { wxGetApp().CreateTransformGLList(list, show_grippers_on_drag); wxGetApp().m_drag_matrix = gp_Trsf(); for(It = list.begin(); It != list.end(); It++){ HeeksObj* object = *It; if(object->m_visible)wxGetApp().m_hidden_for_drag.push_back(object); object->m_visible = false; } } return true; }
HeeksDxfRead::HeeksDxfRead(const wxChar* filepath, bool undoable) : CDxfRead(Ttc(filepath)), m_undoable(undoable) { HeeksConfig config; config.Read(_T("ImportDxfAsSketches"), &m_make_as_sketch); config.Read(_T("IgnoreDxfReadErrors"), &m_ignore_errors); config.Read(_T("DxfReadPoints"), &m_read_points); config.Read(_T("LayerNameSuffixesToDiscard"), m_layer_name_suffixes_to_discard); m_current_block = NULL; extract(gp_Trsf(), m_ucs_matrix); }
void Run(){ wxGetApp().m_ruler->m_trsf = gp_Trsf(); wxGetApp().m_frame->RefreshProperties(); wxGetApp().Repaint(); }
//static void TransformTools::Translate(bool copy) { // pick items if(wxGetApp().m_marked_list->size() == 0){ wxGetApp().PickObjects(_("Pick objects to move")); } if(wxGetApp().m_marked_list->size() == 0)return; // get number of copies HeeksConfig config; int ncopies; config.Read(_T("TranslateNumCopies"), &ncopies, 1); if(copy) { // check for uncopyable objects RemoveUncopyable(); if(wxGetApp().m_marked_list->size() == 0)return; // input "number of copies" if(!wxGetApp().InputInt(_("Enter number of copies"), _("number of copies"), ncopies))return; if(ncopies < 1)return; config.Write(_T("TranslateNumCopies"), ncopies); } // clear the selection std::list<HeeksObj *> selected_items = wxGetApp().m_marked_list->list(); wxGetApp().m_marked_list->Clear(true); // pick "from" position if(!wxGetApp().PickPosition(_("Click position to move from"), from))return; // pick "to" position wxGetApp().CreateTransformGLList(selected_items, false); wxGetApp().m_drag_matrix = gp_Trsf(); if(!copy) { for(std::list<HeeksObj*>::const_iterator It = selected_items.begin(); It != selected_items.end(); It++){ HeeksObj* object = *It; if(object->m_visible)wxGetApp().m_hidden_for_drag.push_back(object); object->m_visible = false; } } double to[3]; bool move_to_accepted = wxGetApp().PickPosition(_("Click position to move to"), to, on_move_translate); if(!copy) { for(std::list<HeeksObj*>::iterator It = wxGetApp().m_hidden_for_drag.begin(); It != wxGetApp().m_hidden_for_drag.end(); It++) { HeeksObj* object = *It; object->m_visible = true; } wxGetApp().m_hidden_for_drag.clear(); } wxGetApp().DestroyTransformGLList(); if(!move_to_accepted)return; wxGetApp().CreateUndoPoint(); // transform the objects if(copy) { for(int i = 0; i<ncopies; i++) { gp_Trsf mat; mat.SetTranslationPart(make_vector(make_point(from), make_point(to)) * (i + 1)); double m[16]; extract(mat, m); for(std::list<HeeksObj*>::iterator It = selected_items.begin(); It != selected_items.end(); It++) { HeeksObj* object = *It; HeeksObj* new_object = object->MakeACopy(); #ifdef MULTIPLE_OWNERS object->HEEKSOBJ_OWNER->Add(new_object, NULL); #else object->m_owner->Add(new_object, NULL); #endif new_object->ModifyByMatrix(m); } } wxGetApp().m_marked_list->Clear(true); } else { gp_Trsf mat; mat.SetTranslationPart(make_vector(make_point(from), make_point(to))); double m[16]; extract(mat, m); wxGetApp().Transform(selected_items, m); } wxGetApp().Changed(); }
void GripperSelTransform::MakeMatrix ( const double* from, const double* to, const double* object_m, gp_Trsf& mat ) { mat = gp_Trsf(); switch ( m_data.m_type ) { case GripperTypeTranslate: mat.SetTranslation ( gp_Vec ( make_point ( from ), make_point ( to ) ) ); break; case GripperTypeScale: { gp_Trsf object_mat = make_matrix(object_m); gp_Pnt scale_centre_point = gp_Pnt(0, 0, 0).Transformed(object_mat); double dist = make_point ( from ).Distance ( scale_centre_point ); if ( dist<0.00000001 ) { return; } double scale = make_point ( to ).Distance ( scale_centre_point ) /dist; mat.SetScale( scale_centre_point, scale ); } break; case GripperTypeObjectScaleX: { gp_Trsf object_mat = make_matrix(object_m); gp_Vec object_x = gp_Vec(1, 0, 0).Transformed(object_mat).Normalized(); gp_Pnt scale_centre_point = gp_Pnt(0, 0, 0).Transformed(object_mat); double old_x = make_vector(from) * object_x - gp_Vec(scale_centre_point.XYZ()) * object_x; double new_x = make_vector(to) * object_x - gp_Vec(scale_centre_point.XYZ()) * object_x; if(fabs(old_x) < 0.000000001)return; double scale = new_x/old_x; double m[16] = {scale, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; mat = object_mat * make_matrix(m) * object_mat.Inverted(); } break; case GripperTypeObjectScaleY: { gp_Trsf object_mat = make_matrix(object_m); gp_Vec object_y = gp_Vec(0, 1, 0).Transformed(object_mat).Normalized(); gp_Pnt scale_centre_point = gp_Pnt(0, 0, 0).Transformed(object_mat); double old_y = make_vector(from) * object_y - gp_Vec(scale_centre_point.XYZ()) * object_y; double new_y = make_vector(to) * object_y - gp_Vec(scale_centre_point.XYZ()) * object_y; if(fabs(old_y) < 0.000000001)return; double scale = new_y/old_y; double m[16] = {1, 0, 0, 0, 0, scale, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}; mat = object_mat * make_matrix(m) * object_mat.Inverted(); } break; case GripperTypeObjectScaleZ: { gp_Trsf object_mat = make_matrix(object_m); gp_Vec object_z = gp_Vec(0, 0, 1).Transformed(object_mat).Normalized(); gp_Pnt scale_centre_point = gp_Pnt(0, 0, 0).Transformed(object_mat); double old_z = make_vector(from) * object_z - gp_Vec(scale_centre_point.XYZ()) * object_z; double new_z = make_vector(to) * object_z - gp_Vec(scale_centre_point.XYZ()) * object_z; if(fabs(old_z) < 0.000000001)return; double scale = new_z/old_z; double m[16] = {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, scale, 0, 0, 0, 0, 1}; mat = object_mat * make_matrix(m) * object_mat.Inverted(); } break; case GripperTypeObjectScaleXY: { gp_Trsf object_mat = make_matrix(object_m); gp_Vec object_x = gp_Vec(1, 0, 0).Transformed(object_mat).Normalized(); gp_Pnt scale_centre_point = gp_Pnt(0, 0, 0).Transformed(object_mat); double old_x = make_vector(from) * object_x - gp_Vec(scale_centre_point.XYZ()) * object_x; double new_x = make_vector(to) * object_x - gp_Vec(scale_centre_point.XYZ()) * object_x; if(fabs(old_x) < 0.000000001)return; double scale = new_x/old_x; double m[16] = {scale, 0, 0, 0, 0, scale, 0, 0, 0, 0, scale, 0, 0, 0, 0, scale}; mat = object_mat * make_matrix(m) * object_mat.Inverted(); } break; case GripperTypeRotate: case GripperTypeRotateObject: case GripperTypeRotateObjectXY: case GripperTypeRotateObjectXZ: case GripperTypeRotateObjectYZ: { gp_Trsf object_mat = make_matrix(object_m); gp_Pnt rotate_centre_point = gp_Pnt(0, 0, 0).Transformed(object_mat); gp_Vec start_to_end_vector(make_point(from), make_point(to)); if ( start_to_end_vector.Magnitude() <0.000001 ) return; gp_Vec start_vector ( rotate_centre_point, make_point ( from ) ); gp_Vec end_vector ( rotate_centre_point, make_point ( to ) ); if ( start_vector.Magnitude() <0.000001 ) return; if ( end_vector.Magnitude() <0.000001 ) return; mat.SetTranslation ( -gp_Vec ( rotate_centre_point.XYZ() ) ); gp_Vec vx, vy; wxGetApp().m_current_viewport->m_view_point.GetTwoAxes(vx, vy, false, 0); gp_Vec rot_dir = vx ^ vy; rot_dir.Normalize(); if(m_data.m_type == GripperTypeRotateObjectXY){ // use object z axis gp_Vec object_x = gp_Vec(1, 0, 0).Transformed(object_mat).Normalized(); gp_Vec object_y = gp_Vec(0, 1, 0).Transformed(object_mat).Normalized(); gp_Vec object_z = gp_Vec(0, 0, 1).Transformed(object_mat).Normalized(); rot_dir = object_z; vx = object_x; vy = object_y; } else if(m_data.m_type == GripperTypeRotateObjectXZ){ // use object y axis gp_Vec object_x = gp_Vec(1, 0, 0).Transformed(object_mat).Normalized(); gp_Vec object_y = gp_Vec(0, 1, 0).Transformed(object_mat).Normalized(); gp_Vec object_z = gp_Vec(0, 0, 1).Transformed(object_mat).Normalized(); rot_dir = object_y; vx = object_z; vy = object_x; } else if(m_data.m_type == GripperTypeRotateObjectYZ){ // use object x axis gp_Vec object_x = gp_Vec(1, 0, 0).Transformed(object_mat).Normalized(); gp_Vec object_y = gp_Vec(0, 1, 0).Transformed(object_mat).Normalized(); gp_Vec object_z = gp_Vec(0, 0, 1).Transformed(object_mat).Normalized(); rot_dir = object_x; vx = object_y; vy = object_z; } else if(m_data.m_type == GripperTypeRotateObject){ // choose the closest object axis to use gp_Vec object_x = gp_Vec(1, 0, 0).Transformed(object_mat).Normalized(); gp_Vec object_y = gp_Vec(0, 1, 0).Transformed(object_mat).Normalized(); gp_Vec object_z = gp_Vec(0, 0, 1).Transformed(object_mat).Normalized(); double dpx = fabs(rot_dir * object_x); double dpy = fabs(rot_dir * object_y); double dpz = fabs(rot_dir * object_z); if(dpx > dpy && dpx > dpz){ // use object x axis rot_dir = object_x; vx = object_y; vy = object_z; } else if(dpy > dpz){ // use object y axis rot_dir = object_y; vx = object_z; vy = object_x; } else{ // use object z axis rot_dir = object_z; vx = object_x; vy = object_y; } } gp_Ax1 rot_axis(rotate_centre_point, rot_dir); double sx = start_vector * vx; double sy = start_vector * vy; double ex = end_vector * vx; double ey = end_vector * vy; double angle = gp_Vec(sx, sy, 0).AngleWithRef(gp_Vec(ex, ey, 0), gp_Vec(0,0,1)); mat.SetRotation(rot_axis, angle); } break; default: break; } }