NX二次开发-重命名装配组件
在GC工具里面是有一个重命名装配组件的命令的,除了这个外,好像没看到NX里还有其他可以重命名装配组件的命令,本来以为在UFUN ASSEM装配的头文件里会有更改装配部件名字的函数,但是没有找到,可能没有。本来以为UF_ASSEM_rename_instance这个可以,后来发现还不行,这个只能改右键属性名字。
但是我找到了替换组件的函数,我觉得这个是可以实现功能的。后来我按照自己想到的思路,对照着GC工具就写了一下。
我的思路是这样的:一个单选对话框->选择装配组件->得到tag->由tag得到装配组件的part名字->把名字显示到一个字符串窗口->用户更改名字->copy本地那个装配组件.prt文件->把新名字命名给copy后的那个.prt文件->
然后用替换组件函数替换copy后的那个.prt文件->最后在把copy前那个旧的.prt文件删掉
//RenameComponent // Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h> // Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx> // Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx> #include <uf.h>
#include <uf_ui.h>
#include <uf_modl.h>
#include <uf_part.h>
#include <uf_curve.h>
#include <uf_assem.h>
#include <uf_obj.h>
#include <windows.h>
#include <stdarg.h>
#include <strstream>
#include <iostream>
#include <string>
#include <io.h> // Std C++ Includes
#include <iostream>
#include <sstream> using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr; //------------------------------------------------------------------------------
// NXOpen c++ test class
//------------------------------------------------------------------------------
class MyClass
{
// class members
public:
static Session *theSession;
static UI *theUI; MyClass();
~MyClass(); void do_it();
void print(const NXString &);
void print(const string &);
void print(const char*); int DelectValue;//对话框返回值,决定是否删除原组件
string NameOrPath(const char* Path, int Type);//返回.prt文件名字和所在文件夹路径
void filesearch(string path, int layer);//遍历文件夹所有.prt文件
char part_name[MAX_FSPEC_BUFSIZE];//当前显示部件.prt文件所在路径
char str[];//字符串输入对话框值 private:
Part *workPart, *displayPart;
NXMessageBox *mb;
ListingWindow *lw;
LogFile *lf;
}; //------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL; //------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
MyClass::MyClass()
{ // Initialize the NX Open C++ API environment
MyClass::theSession = NXOpen::Session::GetSession();
MyClass::theUI = UI::GetUI();
mb = theUI->NXMessageBox();
lw = theSession->ListingWindow();
lf = theSession->LogFile(); workPart = theSession->Parts()->Work();
displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
} //------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
} static int select_filter_proc_fn(tag_t object, int type[], void* user_data, UF_UI_selection_p_t select)
{
if (object == NULL)
{
return UF_UI_SEL_REJECT;
}
else
{
return UF_UI_SEL_ACCEPT;
}
} static int init_proc(UF_UI_selection_p_t select, void* user_data)
{
int num_triples = ;//可选类型的数量
UF_UI_mask_t mask_triples[] =
{ UF_component_type, UF_UI_SEL_NOT_A_FEATURE,
};//可选对象类型
UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, num_triples, mask_triples);
if ((UF_UI_set_sel_procs(select, select_filter_proc_fn, NULL, user_data)) == )
{
return UF_UI_SEL_SUCCESS;
}
else
{
return UF_UI_SEL_FAILURE;
}
} string MyClass::NameOrPath(const char* Path, int Type)
{
//反向找位置,分割字符串(只读取文件夹路径)
string strPath = Path;
string strDir;
int nPos = strPath.find_last_of('\\');
if (string::npos != nPos)
{
strDir = strPath.substr(, nPos);
} //分割字符串(只读取part名字+后缀)
//方法2
int pos = strPath.find_last_of('\\');
string s1(strPath.substr(pos + )); //分割字符串(只读取part名)
string PartName(s1.substr(, s1.find(".prt"))); if (Type == )
{
return PartName;//返回名字
}
else if (Type == )
{
return strDir;//返回文件夹路径
}
} void MyClass::filesearch(string path, int layer)
{
char msg[] = "";
char msgg[] = "";
struct _finddata_t filefind;
string f;
string curr = path + "\\*.*";
int done = , i, handle;
if ((handle = _findfirst(curr.c_str(), &filefind)) != -)
{
while (!(done = _findnext(handle, &filefind)))
{
if (strcmp(filefind.name, "..") == )
continue;
for (i = ; i < layer; i++)
printf("\t");
if ((_A_SUBDIR == filefind.attrib)) // 是目录
{
curr = path + "\\" + filefind.name;
sprintf(msg, "%s\n", curr.c_str());
//UF_UI_write_listing_window(msg);
filesearch(curr, layer + ); // 递归遍历子目录
}
else // 是文件
{ sprintf(msg, "%s", filefind.name);
if (strlen(msg) > )
{
strncpy(msgg, msg + strlen(msg) - , );
if (strcmp(msgg, ".prt") == ) // 文件格式
{
f = path + "\\" + filefind.name;
sprintf(msg, "%s\n", f.c_str());
//UF_UI_write_listing_window(msg); //分割字符串(只读取part名)
string PartName = NameOrPath(f.c_str(), );
string PartPath = NameOrPath(f.c_str(), ); //分割字符串(只读取part名)
string PartName1 = NameOrPath(part_name, ); //找到名字相同的.prt文件
if (PartName == PartName1)
{
//转换
char NewName1[];
sprintf(NewName1, "\\%s.prt", str);
string NewName2 = NewName1;
//字符串拼接
string NewName = PartPath + NewName2; //copy出一个新的.prt文件
CopyFile(f.c_str(), NewName.c_str(), FALSE); //由名字得到装配部件实例的TAG
tag_t instanceTAG = UF_ASSEM_ask_instance_of_name(UF_PART_ask_display_part(), part_name); //重新命名装配部件的part名称
UF_PART_load_status_t load_status;
UF_ASSEM_use_alternate(&instanceTAG, NewName.c_str(), str, str, &load_status); //由对话框值判断是否删除原组件
if (DelectValue == )
{
//删除旧名字的.prt文件
DeleteFile(f.c_str());
} } }
}
}
}
_findclose(handle);
}
} //------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{ // TODO: add your code here UF_initialize(); //单对象选择对话框
char sCue[] = "单对象选择对话框";
char sTitle[] = "选择一个装配组件";
int iScope = UF_UI_SEL_SCOPE_NO_CHANGE;
int iResponse;
tag_t tView;
double adCursor[];
tag_t ComponentTag = NULL_TAG;//单选控件获得的tag
UF_UI_select_with_single_dialog(sCue, sTitle, iScope, init_proc, NULL, &iResponse, &ComponentTag, adCursor, &tView); //获取装配部件的part名称
char refset_name[UF_OBJ_NAME_BUFSIZE];
char instance_name[UF_CFI_MAX_FILE_NAME_BUFSIZE];
double origin[];
double csys_matrix[];
double transform[][];
UF_ASSEM_ask_component_data(ComponentTag, part_name, refset_name, instance_name, origin, csys_matrix, transform); //输入字符串控件
char * cue = "输入框";
//转换
char str1[];
sprintf(str1, "%s", part_name);
//分割字符串(只读取part名)
string PartName1 = NameOrPath(str1, );
sprintf(str, "%s", PartName1.c_str());
int length = ;
uc1600(cue, str, &length); //弹出对话框
char sPromptStr1[] = "单选菜单对话框";
int iDefault1 = ;
char asOptions1[][] = { "删除原组件", "保留原组件" };
int iNumOfOptions1 = ;
DelectValue = uc1603(sPromptStr1, iDefault1, asOptions1, iNumOfOptions1); //获得当前显示部件.prt文件所在路径
char part_fspec[MAX_FSPEC_BUFSIZE];
UF_PART_ask_part_name(UF_PART_ask_display_part(), part_fspec); //获取文件夹路径
string strDir = NameOrPath(part_fspec, ); //遍历文件夹
filesearch(strDir, ); UF_terminate(); } //------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
try
{
// Create NXOpen C++ class instance
MyClass *theMyClass;
theMyClass = new MyClass();
theMyClass->do_it();
delete theMyClass;
}
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
catch (const exception& e2)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
}
catch (...)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
}
} //------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
} Caesar卢尚宇
2019年8月12日

补充:
今天又写了第二种方法(2019年8月13日)
//NX9_NXOpenCPP_Wizard2 // Mandatory UF Includes
#include <uf.h>
#include <uf_object_types.h> // Internal Includes
#include <NXOpen/ListingWindow.hxx>
#include <NXOpen/NXMessageBox.hxx>
#include <NXOpen/UI.hxx> // Internal+External Includes
#include <NXOpen/Annotations.hxx>
#include <NXOpen/Assemblies_Component.hxx>
#include <NXOpen/Assemblies_ComponentAssembly.hxx>
#include <NXOpen/Body.hxx>
#include <NXOpen/BodyCollection.hxx>
#include <NXOpen/Face.hxx>
#include <NXOpen/Line.hxx>
#include <NXOpen/NXException.hxx>
#include <NXOpen/NXObject.hxx>
#include <NXOpen/Part.hxx>
#include <NXOpen/PartCollection.hxx>
#include <NXOpen/Session.hxx> #include <uf.h>
#include <uf_assem.h>
#include <uf_obj.h>
#include <uf_part.h>
#include <uf_modl.h>
#include <uf_ui.h>
#include <windows.h>
#include <uf_disp.h> // Std C++ Includes
#include <iostream>
#include <sstream> using namespace NXOpen;
using std::string;
using std::exception;
using std::stringstream;
using std::endl;
using std::cout;
using std::cerr; //------------------------------------------------------------------------------
// NXOpen c++ test class
//------------------------------------------------------------------------------
class MyClass
{
// class members
public:
static Session *theSession;
static UI *theUI; MyClass();
~MyClass(); void do_it();
void print(const NXString &);
void print(const string &);
void print(const char*); //单选
int DelectValue;//对话框返回值,决定是否删除原组件
string NameOrPath(const char* Path, int Type);//返回.prt文件名字和所在文件夹路径 private:
Part *workPart, *displayPart;
NXMessageBox *mb;
ListingWindow *lw;
LogFile *lf;
}; //------------------------------------------------------------------------------
// Initialize static variables
//------------------------------------------------------------------------------
Session *(MyClass::theSession) = NULL;
UI *(MyClass::theUI) = NULL; //------------------------------------------------------------------------------
// Constructor
//------------------------------------------------------------------------------
MyClass::MyClass()
{ // Initialize the NX Open C++ API environment
MyClass::theSession = NXOpen::Session::GetSession();
MyClass::theUI = UI::GetUI();
mb = theUI->NXMessageBox();
lw = theSession->ListingWindow();
lf = theSession->LogFile(); workPart = theSession->Parts()->Work();
displayPart = theSession->Parts()->Display(); } //------------------------------------------------------------------------------
// Destructor
//------------------------------------------------------------------------------
MyClass::~MyClass()
{
} //------------------------------------------------------------------------------
// Print string to listing window or stdout
//------------------------------------------------------------------------------
void MyClass::print(const NXString &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const string &msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
}
void MyClass::print(const char * msg)
{
if(! lw->IsOpen() ) lw->Open();
lw->WriteLine(msg);
} static int select_filter_proc_fn(tag_t object, int type[], void* user_data, UF_UI_selection_p_t select)
{
if (object == NULL)
{
return UF_UI_SEL_REJECT;
}
else
{
return UF_UI_SEL_ACCEPT;
}
} static int init_proc(UF_UI_selection_p_t select, void* user_data)
{
int num_triples = ;//可选类型的数量
UF_UI_mask_t mask_triples[] =
{ UF_component_type, UF_UI_SEL_NOT_A_FEATURE,
};//可选对象类型
UF_UI_set_sel_mask(select, UF_UI_SEL_MASK_CLEAR_AND_ENABLE_SPECIFIC, num_triples, mask_triples);
if ((UF_UI_set_sel_procs(select, select_filter_proc_fn, NULL, user_data)) == )
{
return UF_UI_SEL_SUCCESS;
}
else
{
return UF_UI_SEL_FAILURE;
}
} string MyClass::NameOrPath(const char* Path, int Type)
{
//反向找位置,分割字符串(只读取文件夹路径)
string strPath = Path;
string strDir;
int nPos = strPath.find_last_of('\\');
if (string::npos != nPos)
{
strDir = strPath.substr(, nPos);
} //分割字符串(只读取part名字+后缀)
//方法2
int pos = strPath.find_last_of('\\');
string s1(strPath.substr(pos + )); //分割字符串(只读取part名)
string PartName(s1.substr(, s1.find(".prt"))); if (Type == )
{
return PartName;//返回名字
}
else if (Type == )
{
return strDir;//返回文件夹路径
}
} //------------------------------------------------------------------------------
// Do something
//------------------------------------------------------------------------------
void MyClass::do_it()
{ // TODO: add your code here UF_initialize(); //单对象选择对话框
char sCue[] = "单对象选择对话框";
char sTitle[] = "选择一个装配组件";
int iScope = UF_UI_SEL_SCOPE_NO_CHANGE;
int iResponse;
tag_t tView;
double adCursor[];
tag_t ComponentTag = NULL_TAG;//单选控件获得的tag
UF_UI_select_with_single_dialog(sCue, sTitle, iScope, init_proc, NULL, &iResponse, &ComponentTag, adCursor, &tView); //获取装配部件的part名称
char part_name[MAX_FSPEC_BUFSIZE];//当前显示部件.prt文件所在路径
char refset_name[UF_OBJ_NAME_BUFSIZE];
char instance_name[UF_CFI_MAX_FILE_NAME_BUFSIZE];
double origin[];
double csys_matrix[];
double transform[][];
UF_ASSEM_ask_component_data(ComponentTag, part_name, refset_name, instance_name, origin, csys_matrix, transform); //输入字符串控件
char * cue = "输入框";
//转换
char str1[];
sprintf(str1, "%s", part_name);
//分割字符串(只读取part名)
string PartName1 = NameOrPath(str1, );
char str[];//字符串输入对话框值
sprintf(str, "%s", PartName1.c_str());
int length = ;
uc1600(cue, str, &length); //弹出对话框
char sPromptStr1[] = "单选菜单对话框";
int iDefault1 = ;
char asOptions1[][] = { "删除原组件", "保留原组件" };
int iNumOfOptions1 = ;
DelectValue = uc1603(sPromptStr1, iDefault1, asOptions1, iNumOfOptions1); //返回原型标识
tag_t ComponentPart = UF_ASSEM_ask_prototype_of_occ(ComponentTag); //设置为工作部件
UF_ASSEM_set_work_part(ComponentPart); //获得当前工作部件.prt文件所在路径
char part_fspec1[MAX_FSPEC_BUFSIZE];
UF_PART_ask_part_name(UF_ASSEM_ask_work_part(), part_fspec1); //重命名实例名称
UF_PART_rename(ComponentPart, str); //获得当前显示部件.prt文件所在路径
char part_fspec[MAX_FSPEC_BUFSIZE];
UF_PART_ask_part_name(UF_PART_ask_display_part(), part_fspec); //获取文件夹路径
string strDir = NameOrPath(part_fspec, ); //转换
char msg[];
sprintf_s(msg, "\\%s.prt", str);
string strDir1 = msg; //字符串拼接
string strDir2 = strDir + strDir1; //另存为改名后的.prt
UF_PART_save_as(strDir2.c_str()); //把显示部件设置为工作部件
UF_ASSEM_set_work_part(UF_PART_ask_display_part()); //部件清理,移除高亮
NXOpen::PartCleanup *partCleanup1;
partCleanup1 = theSession->NewPartCleanup();
partCleanup1->SetTurnOffHighlighting(true);
partCleanup1->DoCleanup(); //删除旧的.prt文件
if (DelectValue == )
{
DeleteFile(part_fspec1);
} UF_terminate();
} //------------------------------------------------------------------------------
// Entry point(s) for unmanaged internal NXOpen C/C++ programs
//------------------------------------------------------------------------------
// Explicit Execution
extern "C" DllExport void ufusr( char *parm, int *returnCode, int rlen )
{
try
{
// Create NXOpen C++ class instance
MyClass *theMyClass;
theMyClass = new MyClass();
theMyClass->do_it();
delete theMyClass;
}
catch (const NXException& e1)
{
UI::GetUI()->NXMessageBox()->Show("NXException", NXOpen::NXMessageBox::DialogTypeError, e1.Message());
}
catch (const exception& e2)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, e2.what());
}
catch (...)
{
UI::GetUI()->NXMessageBox()->Show("Exception", NXOpen::NXMessageBox::DialogTypeError, "Unknown Exception.");
}
} //------------------------------------------------------------------------------
// Unload Handler
//------------------------------------------------------------------------------
extern "C" DllExport int ufusr_ask_unload()
{
return (int)NXOpen::Session::LibraryUnloadOptionImmediately;
} Caesar卢尚宇
2019年8月13日

补充2019年11月18日
今天有网友合工大-wzl给我留言,纠正了一个bug,在这个例子中,这个函数tag_t instanceTAG = UF_ASSEM_ask_instance_of_name(UF_PART_ask_display_part(), part_name);
里面的这个输入参数,part_name,不应该是part的名字,应该是装配部件的实例名称instance_name。这个地方是我的一个疏忽,因为默认情况下应该part名字和实例名字是一个名字。
感谢网友纠正的错误。
NX二次开发-重命名装配组件的更多相关文章
- NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))
NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...
- NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...
- NX二次开发-创建NX9 NXOpenCPP Wizard开发向导模板
这篇文章,我在CSDN,在唐工论坛都发过.http://www.nxopen.cn/forum.php?mod=viewthread&tid=2039&highlight=NX9 博客 ...
- NX二次开发-Block UI C++界面关于 在Block UI中UF_initialize();和UF_terminate();的使用
关于 在Block UI中UF_initialize();和UF_terminate();的使用 用Block UI作NX二次开发的时候,不需要在使用UFUN函数的时候加UF_initialize() ...
- NX二次开发-基于MFC界面对话框与NX交互的开发
打开VS2013 点击新建,选择MFC DLL 点击确定 点下一步 什么都不改,直接点完成 进来之后先编译一下,看是否编译成功 打开项目属性,更改这几处 $(UGII_BASE_DIR)\ugopen ...
- NX二次开发-BlockUI对话框嵌套MFC对话框制作进度条
半年前在一些QQ群看到有大神NX二次开发做出了进度条,那个时候我还不会弄,也不知道怎么弄得,后来断断续续得研究了一下,直到今天我把它做出来了.内心还是很喜悦的!回想自己这两年当初从没公司肯给我做NX二 ...
- NX二次开发-UDO用户自定义对象(UFUN)【持续完善】
每当提起UDO总是会让我想起大专毕业那会失业找工作,后来有个宝贵机会去了软件公司上班,拿到了我人生中的第一个NX二次开发项目,一个关于测量汽车前后左右摄像头的项目.当时那个项目就用到了UDO,对于只看 ...
- NX二次开发-UFUN计算两点距离UF_VEC3_distance
NX11+VS2013 #include <uf.h> #include <uf_curve.h> #include <uf_vec.h> UF_initializ ...
- NX二次开发-UFUN拉伸函数UF_MODL_create_extruded
NX9+VS2012 //NX二次开发中常用拉伸函数为UF_MODL_create_extruded2,但是此函数不能拉伸片体, //想要拉伸片体用函数UF_MODL_create_extruded. ...
随机推荐
- delphi 文件操作(信息获取)
delphi获取Exe文件版本信息的函数 Type TFileVersionInfo = Record FixedInfo:TVSFixedFileInfo; {版本信息} CompanyName:S ...
- Delphi 获取系统当前进程、窗口句柄、文件属性以及程序运行状态
uses TLHelp32,PsAPI;(1)显示进程列表: procedure TForm1.Button2Click(Sender: TObject); var lppe: TProcessEnt ...
- HBase与Hive交互操作案例
HBase与Hive交互操作 1.环境准备 因为我们后续可能会在操作Hive的同时对HBase也会产生影响,所以Hive需要持有操作HBase的Jar,那么接下来拷贝Hive所依赖的Jar包(或者使用 ...
- angularjs 中 Factory,Service,Provider 之间的区别
本片文章是使用了 angularjs 中使用 service 在controller 之间 share 对象和数据 的code(http://jsfiddle.net/kn46u0uj/1/) 来进行 ...
- Spellchecker inspection helps locate typos and misspelling in your code, comments and literals, and fix them in one click
Pycharm设置 Pycharm总是很多的拼写检查波拉线 Spellchecker inspection helps locate typos and misspelling in your cod ...
- 1251 client does not support
1.mysql -uroot -p 123456 (用户root,密码123465) 2.use mysql: 3.ALTER USER 'root'@'localhost' IDENT ...
- 【一】Jmeter接口自动化测试系列之参数化方法
Jmeter作为虽然作为一款和LoadRunner相媲美的性能测试工具,但参数化功能实在不咋地,这里我大概总结了一下Jmeter的参数化方法! 至于参数化的用途,我这里就不多说了,做测试的都明白吧!本 ...
- NIO 源码分析(01) NIO 最简用法
目录 一.服务端 二.客户端 NIO 源码分析(01) NIO 最简用法 Netty 系列目录(https://www.cnblogs.com/binarylei/p/10117436.html) J ...
- leetcode.字符串.14最长公共前缀-Java
1. 具体题目 编写一个函数来查找字符串数组中的最长公共前缀.如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: ["flower","fl ...
- gitnore文件修改生效方法
本文首发于cartoon的博客 转载请注明出处:https://cartoonyu.github.io/cartoon-blog 当修改gitnore文件后,常常出现文件不生效的情况, ...