SolidWorks二次开发语法技巧及基础

2023-11-15

语法:

//变量
'HRESULT 
接口返回值 用于异常调用时判断 
本质 typedef LONG HRESULT; 32位
S_OK
S_FALSE

'OLECHAR
特定平台上表示文本数据
win32内 定义为 wchar_t 16 或32 位 char 8位
一般定义为 OLECHAR * 形式的参数

'BSTR
包含长度的OLECHAR字符串,提高速度
typedef OLECHAR BSTR;
属性
    是一个指针类型数据,指向数组第一个字符,长度前缀以整数形式恰好存储在数组第一个字符之前
    BSTR是一个指向包含长度前缀的OLECHAR字符数组的指针
    字符数组以NULL字符作为结尾
    长度前缀以字节为单位而不是字符,并且不包括NULL终止符

'CComBSTR ''ATL工具类
是一个ATL工具类,封装了BSTR,文件atlbase.h中包含了CComBSTR的定义,经常使用<向导中已经加入>
这个类维护的唯一状态是一个BSTR类型的公有成员变量m_str
class CComBSTR
{
    public:
    BSTR m_str;
}
CComBSTR的初始化--有8个构造函数
直接初始化: CComBSTR name("Hello SolidWorks");
调用CComBSTR的LoadString函数,二次开发中使用较多
CComBSTR title;
title.LoadString(IDS_TOOLBAR_TITLE);//IDS_TOOLBAR_TITLE是在资源文件中定义的一个字符串

'VARIANT
通用数据类型,常用于接口方法参数,接口方法返回值
既包含数据又包含数据的类型可以实现各种不同的自动化传输
定义 太长了... 不写了----在第16页,内有类型代号
C结构,包含一个类型成员vt,用于表示该VARIANT是什么类型,后面的union保存变量值 先判断再取值
VARIANT va;
::Variantlnit(&va);        //初始化,该函数为COM库函数
int a=2002;
va.vt=VT_I4;            //指明long数据类型
va.1Val=a;                //赋值

'SafeArray
安全数组,用于OLE自动化中的数组型参数传递,在SolidWorks API中也有广泛的应用,用于传递数组型参数
如:零件文档对象中的设置零件材质的函数
  PartDoc::SetMaterialPropertyValues(MaterialPropertyValues)
  MaterialPropertyValues即是SafeArray,传递描述材质的9个值(r,g,b,Ambient,Diffuse,Specular,Shininess,Transparency,Emission)
SafeArray实质上:将通常的数组添加描述符,说明维度,长度,边界,以及元素类型---一般不单用,包装于VARIANT类型中 VARIANT的vt值为VT_ARRAY|*则封装了SafeArray,SafeArray中可以放在VARIANT的任何类型包括VARIANT

'CComPtr '智能指针
//CComPtr被称为智能指针,是ATL提供的一个模版类,能够从语法上自动完成AddRef和Release。(源代码在atlbase.h中)
//CComPtr的用法很简单,以IHello*为例,将程序中所有接口指针类型(除了参数),都使用CComPtr<IHello> 代替即可。即程序中除了参数之外,再也不要使用IHello*,全部以CComPtr<IHello>代替。
//CComPtr的用法和普通COM指针几乎一样,另外使用中有以下几点需要注意。
//1. CComPtr已经保证了AddRef和Release的正确调用,所以不需要,也不能够再调用AddRef和Release。
//2. 如果要释放一个智能指针,直接给它赋NULL值即可。
//3. CComPtr本身析构的时候会释放COM指针。
//4. 当对CComPtr使用&运算符(取指针地址)的时候,要确保CComPtr为NUL。(因为通过CComPtr的地址对CComPtr赋值时,不会自动调用AddRef,若不为NULL,则前面的指针不能释放,CComPtr会使用assert报警)
//以刚才的程序为例:
//void SomeApp( IHello * pHello )
//{
//CComPtr<IHello> pCopy = pHello;
//OtherApp();
//pCopy->Hello();
//}
//由于pCopy是一个局部的对象,所以即使OtherApp()抛出异常,pCopy也会被析构,指针能够被释放。
//如果不想在程序临近发布前,还因为COM指针的引用计数造成崩溃的话,就牢记这一点吧:程序中除了参数之外,不要直接使用COM指针类型,一定要全部以CComPtr<IXXX>代替。

例子:
CComPtr<IModelDoc2>pDoc;            //ModelDoc2所有文档类的父类,IModelDoc2 ModelDoc2的接口指针?
CComPtr<ISelectMgr>pSleMgr;            //选择管理器的接口?
CComPtr<IDispatch>pDisp;            //接口指针
psldWorks->get_IActiveDoc2(&pDoc);    //得到当前活动窗口 引用形参...
pDoc->get_ISelectionManager(&pSleMgr);//得到选择管理器
pSleMgr->GetSelectedObject5(1,&pDisp);//得到用户选择的对象
IFeaturePtr pFeat(pDisp);            //默认为构造一个特征对象
pDisp=NULL;
pFeat->GetSpecificFeature(&pDisp);
ISketchPtr pSketch(pDisp);            //得到该特征的草图
pDisp=NULL;
VARIANT vSplines;
pSketch->GetSplinesInterpolate(&vSplines);//得到样条曲线的控制点
SafeArray arrSplines(vSplines);              //定义一个安全数组
for(int idx=0;idx<arrSplines.getSize();idx++)
{
    ::AfxTrace("arrSplines(%d)=%f\n",idx,arrSplines[idx]); //输出数据
}


@接口指针
往往采用接口指针的方法,获得接口指针后调用接口中的方法进行开发

直接定义:IDispatch * pDisp;//定义一个指向IDispatch接口的指针
ptr后缀:IDispatchPtr pDisp;//定义一个指向IDispatch接口的指针
LP开头 :LPModelDoc2 pModel=NULL;//定义一个指向IModelDoc2接口的指针
pSldWorks->get_IActiveDoc2(&pModel);    //通过ISldWorks获取接口指针
//调用接口实现功能
...
pModel->Release();//释放接口

以上三种方法必须手动释放否则会一直占用资源,因而引入了智能指针CComPtr CComQIPtr
CComPtr是ATL提供的只能COM接口指针类
使用COM组件过程中,需要严格使用AddRef与Release,否则会导致COM组件不被释放而占用系统资源

CComPtr功能:
    1构造函数多
    2自动释放
    3异常时也能释放
    4赋值期间,在改写被封装的的接口指针之前释放他
    5赋值期间,对接收到的接口指针调用AddRef
    6可以在许多(不是全部)通过使用原始接口指针的场合使用

    CComPtr 可以为指定的接口指针类型创建实例
例子:
    pSldWorks->get_IActiveDoc2(&pModel);//获取接口指针
    ...//调用接口的方法实现功能
    CComQIPtr
    更加智能的指针类完成前者所有功能以及更多功能
    当把一个与智能指针不同类型的接口指针赋值给CComQIPtr实例时,这个类会对输入的接口调用QueryInterface
例子:
    CComPtr<IUnknown>punk /*初始化某一接口*/
    CComQIPtr<INamedObject>pno=puk;//此处会调用punk->QueryInterface(IID_INameObject...)

获取接口的方法
方式:
1 QueryInterface方法 '限于需要访问的借口是在同一个COM对象内,对于不在同一个COM对象内的接口,需要其他方法
    是COM组件IUnknown接口中的三个基本函数之一,为COM组件提供接口相互访问的功能,通过它可以访问组件内的任意接口
    {
    //通过SolidWorks获取当前活动文档的ModelDoc
    CComPtr<IModelDoc2>pModel;//定义IModelDoc2类型指针
    retval=m_ISldWorks->get_IActiveDoc2(&pModel);//m_ISldWorks在入口函数处初始化
    ASSERT(pModel);//测试pModel是否为NULL 为NULL则是假 则跳出 
    if(retval!=S_OK)
        return;
    CComPtr<IPartDoc>pPartDoc;//定义IPartDoc类型的智能指针
    retval=m_ModelDoc->QueryInterface(IID_IPartDoc,(LPVOID*)&pPartDoc);//LPVOID是一个没有类型的指针,也就是说你可以将任意类型的指针赋值给LPVOID类型的变量(一般作为参数传递),然后在使用的时候再转换回来。 
    ASSERT(pPartDoc);
    if(retval!=S_OK)
        return;
    }
    retval 
    HRESULT/*接口返回值类型*/  f([in] long n1, [out, retval]   long   *pn);
    [in]表示参数方向是输入;[out]表示参数方向是输出;[out,retval]表示参数方向是输出,同时可以作为函数运算结果的返回值。
    一个函数中,可以有多个[in]、[out],但[retval]只能有一个,并且要和[out]组合后在最后一个位置。
    retval 表示  *pn 是返回值   
    HRESULT f([out,retval]   long   *pn) 的含义可以理解为该接口有如下形式的方法: long* f()   
    如果去掉它,则类似的表示:     void   f(   long*   pn)   
    out是输出参数,加上retval表示同时作为函数的返回值返回。这是为了支持VB、ASP等语言。因为在C++中可以以参数引用的方式取得返回指,而VB、asp中没有引用,没有指针的概念。

    assert( <expression> ); DEBUG运行时 测试函数 如果表达式的值为假,整个程序将退出,并输出一条错误信息,测试表达式
    SUCCEEDED(hr);判断返回的HRESULT类型的hr是否为S_OK
    assert(pvTo   !=   NULL   &&   pvFrom   !=   NULL);//当为假时就会报错 
    当expression结果为“假”时,会在stderr中输出这条语句所在的文件名和行号,以及这条表达式。这只在调试版本中起作用,在Release版本中不会产生任何代码。 
    #ifdef   DEBUG
    ...//测试代码
    #endif
    assert并不是一个仓促拼凑起来的宏,为了不在程序的交付版本和调试版本之间引起重要的差别,需要对其进行仔细的定义。宏assert不应该弄乱内存,不应该对未初始化的数据进行初始化,
    即它不应该产主其他的副作用。正是因为要求程序的调试版本和交付版本行为完全相同,所以才不把assert作为函数,而把它作为宏。如果把assert作为函数的话,其调用就会引起不期望的内存或代码的兑换。
    要记住,使用assert的程序员是把它看成一个在任何系统状态下都可以安全使用的无害检测手段 

    接口查询QueryInterface
    原始定义:QueryInterface(const IID& iid, void ** ppv) =0;  
    interface IUnknown
    {
        virtual HRESULT __stdcall 
        QueryInterface(const IID& iid, void    ** ppv) =0; //原始定义           
        virtual     ULONG __stdcall     AddRef() =0 ;
        virtual     ULONG __stdcall     Release() =0 ;
    };
    1.作用 
    看命名就可以猜这个方法是用来查询组件是否支持某个特定接口。若支持泽返回指向此接口的指针。
    2.参数 
    QueryInterface方法有两个参数,
    第一个为接口标识符,简称IID,全名(Interface Identifier),现在可以只理解为一个常量 常引用形参
    第二个参数即为返回的接口指针 将查的指针赋给第二个参数
    返回值为HRESULT 返回S_OK S_FAULT 也可用SUCCEEDED()测试 若hr的值为S_OK则为真
    3.使用方法
    我们先来看示例代码

    定义一个继承自IUnknown接口的IX

    interface IX : IUnknown
    {
        virtual void __stdcall     Fx() = 0 ;
    } ;
    
    若CA实现了该IX接口,则使用如下

    static const IID IID_IX = {0x32bb8320, 0xb41b, 0x11cf,{0xa6, 0xbb, 0x0, 0x80, 0xc7, 0xb2, 0xd6, 0x82}} ;
    void foo(IUnknown* pI)
    {
        IX* pIX=NULL;
        HRESULT hr=pI->QueryInterface(IID_IX,(void    **)&pIX);//HRESULT存储是否调用成功的变量 
        if    (SUCCEEDED(hr))
        {
           pIX->Fx();
        }
    }

    HRESULT 
    HRESULT是一个查询结果状态集合,并非true或false可以表示的,所以用SUCCEEDED方法来判断查询结果是否成功,失败的话,接口指针为NULL.

    4.QueryInterface的实现 
    CA继承了IX,由于IX继承了IUnknown接口,所以CA也必须实现IUnknown接口成员,我们重新来看一下QueryInterface方法的参数
    virtual HRESULT __stdcall QueryInterface(const IID& iid, void ** ppv) =0; 
    该方法会根据传输不同iid,而返回相对应的接口指针,为了演示,我们再定义一个接口IY,CA实现IX和IY,
    如下实现
    HRESULT __stdcall CA::QueryInterface(const IID& iid, void    ** ppv)
    {   
        if (iid == IID_IUnknown)
        {
            *ppv = static_cast    <IX*>(this    ) ;
        }
        else if (iid == IID_IX)
        {
            *ppv = static_cast    <IX*>(this    ) ;
        }
        else if     (iid == IID_IY)
        {
            *ppv = static_cast    <IY*>(this    ) ;
        }
        else    
        {         
            *ppv = NULL ;
            return E_NOINTERFACE;
        }
        return    S_OK ;
    }
    
    是不是很简单?,获取到以后用static_cast 来转换类型。IID_IUnknown,S_OK,E_NOINTERFACE等都是内置的状态码

2层级访问
SolidWorks API对象访问也是一个从上到下依次访问的过程,为了访问该接口对象先获得高一级的接口对象
要获得当前活动文档中的选择管理器指针--API结构图--SldWorks->ModelDoc->SelectionMgr
实现代码
{
//首先必须获得 SolidWorks应用程序对象--m_iSldworks--在用户加载插件时完成初始化的
//通过SldWorks获取当前活动文档的ModelDoc
CComPtr<IModelDoc2>pModel;
retval=m_iSldWorks->get_IActiveDoc2(&pModel);//m_iSldWorks对象的get_IActiveDoc2函数获得当前活动文档接口后
ASSERT(pModel);                                 //m_iSldWorks在入口函数处初始化 retval是HRESULT类型的数据
if(retval!=S_OK)
return;
//通过IModelDoc2获取ISelectionMgr
CComPtr<ISelectionMgr>pSelMgr;
retval=pModel->get_ISelectionManager(&pSleMgr);//通过IModelDoc2接口中的get_ISelectionManager函数获得SelectionMgr对象指针
ASSERT(pSelMgr);
if(retval!=S_OK)
return;
}
获取接口是一个由上到下依次访问的过程

间接访问
如:对于用户选择的元素对象,可以先获取SelectionMgr对象,然后通过该对象中的GetSelectedObject获取被选择的元素,
在判断元素类型的基础上,通过引用获得目标对象,如获取一个用户选择的面
实现:
{
    //通过SldWorks获取当前活动文档的ModelDoc
    CComPtr<IModelDoc2>pModel;
    Retval=m_iSldWorks->get_IActiveDoc2(&pModel);//m_iSliWorks在入口函数处初始化
    ASSERT(pModel);
    if(retval!=S_OK)
        return;
    //通过IModelDoc2获取ISelectionMgr
    CComPtr<ISelectionMgr>pSelMgr;
    retval=pModel->get_ISelectionManager(&pSelMgr);
    ASSERT(pSelMgr);
    if(retval!=S_OK)
    return;
}

很多时候上述三种方法结合使用,而且SolidWorks API中一个对象往往可以通过多种方法获得
若在一个COM对象内可以用QueryInterface查询
获得面积 Face2::GetArea函数需先获得Face对象
PartDoc-Body2-Body2::GetFirstFace Body2::GetNextFace

假设用户选择一个面,可以通过SelectionMgr::GetSelectedObject函数获得选择对象,通过引用得到选择的面对象

知道Face对象名称基础上,通过PartDoc中的GetEntityByName函数获得面对象

使用接口
SolidWorks API接口的基本形式为 return-value object::Function(Parameters) //parameters参量

返回类型

@一般类型为bool long等

如:ModelDocExtension::SelectByID含有8个参数,返回一个bool类型的值
  Boolean ModelDocExtension::SelectByID(BSTR Name,BSTR Type,double x,double y,double z,VARIANT_BOOL Append,long Mark,LPCALLOUT Callout)

  COM中调用如下
  VARIANT_BOOL Result=FALSE;
HRESULT hres=ModelDocExtensionObj->SelectByID(_T("Pointl"),_T("SKETCHPOINT"),.2,.3,0,0,0,0,&result);

@返回值为接口

OLE模式-返回一个IDispatch类型类型的接口指针,然后通过IDispatch接口指针获取对应的SolidWorks接口指针
COM模式-直接返回对应的SolidWorks接口指针,因此,在SolidWorks API 中某些功能会有两个函数

目前基于COM方式,OLE就不写了...真懒 - -
//获取第一个面接口指针
HRESULT Body2::IGetFirstFace(LPFACE * retval)
//使用
LPFACE2 FaceObj=NULL;
HRESULT hres=BodyObj->IGetFirstFace(&FaceObj);

@返回值为数组

此时OLE与COM大大不同

COM模式下,使用指针作为参数或者返回值
如:ModelDocExtension::GetMassProperties函数
  HRESULT ModelDocExtension::IGetMassProperties(longAccuracy,longstatus,double * mPropsData)

  BOOL
FALSE = 0

TRUE  = 1

VARIANT_BOOL
VARIANT_FALSE =  0

VARIANT_TRUE  = -1

com技术,运用最多的API,dll插件形式

VBA VB C++ 

除非效率瓶颈在于软件本身,或者设计出现失误,一般而言,dll要比基于OLE的exe快速

VB 定义对象,然后让basic OLE做其他事
C++ 利用类向导生成头文件中的类,通过导入SolidWorks类型库生成应用程序
C 从类型库中确定程序的ID后可设置所调用的应用程序

SolidWorks API 使用面向对象的方法 API中所有函数都适用于对象的方法或属性

另外所有SolidWorks的接口都是基于MFC的

SolidWorks软件通过标准的COM对象显示其API功能,对于OLE使用Idispatch来显示API

COM实现的程序的特点:
是应用程序直接访问基本对象组功能,提高了性能
对每个API调用返回一个HERSULT值
对所有插件DLL推荐COM接口,对于单独的可执行程序(*.exe)也可以使用COM接口除非方法或属性传递一个数组...此时可使用一个VARIANT来压缩数组

访问SolidWorks对象及属性
先获得对象,再调用方法
获得一个面face的area Face2::GetArea

获得Face的方式 
1 PartDoc::Body 获得Body2对象,然后用Body2::GetFirstFace Face2::GetNextFace方法遍历面
2 使用SelectionMgr::GetSelectedObject4从当先所选项目中获得Face2对象   ----或许可以用于后期修改
3 使用PartDoc::GetEntityByName,通过Face2的名称获得Face2对象.获得了Face2对象,便可以访问Face2类中的属性和方法
例如通过Face2::GetEdgeCount获得面的边的数目,或者通过Face2::Normal属性获得法矢量

注意:一些方法或属性要求有所选的项目如:/*组装*/AssemblyDoc::OpenCompFile,要调用它,必须有AssemblyDoc对象和所选的一个零部件

  用户交互选择
  DodelDocExtension::SelectByID 程序化选择
  访问从ACIS SAT文件导入的属性 导入后即变为SolidWorks的属性了,可用标准的属性访问访问这些属性和方法
  属性名定义如下:
    XLTR_ATTRIBUTE_DEFINITION_DOUBLE_TYPE for ATTRIB_GEN_REAL
  ...
  GEN_VECTOR
  每个属性定义有两个参数
  值:该参数是swParamTypeString 类型
    SwParamTypeDouble swParamTypeDouble swParamTypeString swParamTypeInteger 或 swParamTypeDVector是哪种类型取决于以前定义的属性
布尔值
BOOL
FALSE=0
TRUE=1
VARIANT_BOOL
VARIANT_FALSE=0
VARIANT_TRUE=-1

FALSE总是零

SolidWorks使用API函数的预定义文件
用于C++的
安装目录\samples\appcomm\swconst.h
安装目录\samples\appcomm\swoptions.h
用于vb的,不用...

事件
事件或通知使用 IConnectionPoint机制  安装目录下\samples子目录下有示范代码,摘自控制代码的适当部分 ,这些机制用于DLLs和EXEs
为了接收事件,dll应用程序必须通过对象类型注册通知,每个特殊的对象实例必须注册
如:为接受PartDoc事件,运行程序需要注册现有的每一个PartDoc对象(当前打开的零件文件)也需要注册任何将来生成的PartDoc对象(随后打开或生成的零件文件)
--具体可参阅comuserdll示范工程,提供了事件管理的范例 
除非另有说明,消息函数应该返回S_OK
支持信息的对象有:SldWorks PartDoc AssemblyDoc DrawingDoc ModelView 和 FeatMgrView

帮助函数
为了使用方便SolidWorks提供了一些帮助函数,他们不受SolidWorks API约束,可用于一般的数学,向量,矩阵和数组的操作
位置: 安装目录\samples\appcomm
可以任意使用 它们提供了SLDMG.DLL的类信息
为了使用它们,可用SLDMG.LIB连接工程,对Unicode而言,名称分别是SLDMUGU.DLL和SLDMGU.DLL
也可以在安装目录下找到这些文件,包含MGDEG.H文件到你的代码中和你希望参考的其他需要*.h文件的地方

其他提示:
    获得头文件--为获得任何工程的头文件,在SolidWorks中生成宏也许是有帮助的
    API限制,对SolidWorks内核的要求和限制同时适于API
    检查返回值是否为空或NULL
    执行程序指导--一般OLE运用程序的调用者有责任分配和释放内存,这包括通过SolidWorks函数返回类型

从C++双精度数组中提取整数
一些API返回整数,改整数被打包成双精度数组
建议使用联合...//  联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型和不同长度的变量。
union PackedData_
{
    double doubleValue;
    int intValues[2];
}PackedData;
int iValue1, iValue2;
为了访问赋给doubleValue的数组元素数据,使用intValues来访问整数...
PackedData.doubleValue=dArray[0];
iValue1=PackedData.intValues[0];
iValue2=PackedData.intValues[1];

接口指针
每个自动返回接口指针的SolidWorks API方法使参考接口指针数自动增加一
COM实现程序:
可以调用返回接口指针的SolidWorks API,然后可以随心所欲的使用该指针,但是也有义务释放它
C++ 获得接口指针示范:
{
    LPMODELDOC m_ModelDoc = NULL;
    HRESULT res = UserApp()->getSWApp()->get_IActiveDoc( &m_ModelDoc);//获得IModelDoc指针
    if( m_ModelDoc == NULL)
    res=m_ModelDoc->QueryInterface(IID_IPartDoc,(LPVOID *) &m_PartDoc);//获得IPartDoc指针
    ASSERT(res==S_OK);
    ...//在代码中使用接口
    m_ModelDoc->Release();//释放IModelDoc指针
    m_PartDoc->Release();//释放IPartDoc指针

}

调用的实现(Dispatch implementations)
Dispatch//调用
implementation//实现

接口指针的释放隐藏在调用对象的销毁里(例如 ImodelDoc Iface 等等)
这意味着附加接口指针到一个以上的调用对象将导致每个对象执行释放,因为超出了了范围当接口指针返回时,参考数仅增加了一次,
如果附加指针到一个意向的对象时,为了避免这个问题必须手工增加参考数 (pdisp->AddRef();)
示范如何处理接口指针的参考数

接口实现范例
{
    LPDISPATCH modDisp;
    modDisp=UserApp->getSWApp()->GetActiveDoc();//获得家伙文件接口的指针
    //modDisp的参考数自动增加一
        if(modDisp==NULL)
            return;
    IModelDoc m_ModelDoc( modDisp ); //连接到IModelDoc对象
    IPartDoc m_PartDoc(modDisp);//连接到IPartDoc
    modDisp->AddRef();
    //手动增加modDisp的参考数,因为这是第二次使用modDisp
    ...//在代码中适用对象
}//变量超出范围 调用IModelDoc和IPartDoc销毁,这将减少modDisp的参考数为2
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SolidWorks二次开发语法技巧及基础 的相关文章

  • socket网络编程几大模型?看看CHAT是如何回复的?

    CHAT回复 网络编程中常见的有以下几种模型 1 阻塞I O模型 Blocking I O 传统的同步I O模型 一次只处理一个请求 2 非阻塞I O模型 Non blocking I O 应用程序轮询调用socket相关函数检查请求 不需
  • 什么是充放电振子理论?

    CHAT回复 充放电振子模型 Charging Reversal Oscillator Model 是一种解释ENSO现象的理论模型 这个模型把ENSO现象比喻成一个 热力学振荡系统 在这个模型中 ENSO现象由三个组成部分 充电 Char
  • 软件测试|sqlalchemy relationship

    简介 SQLAlchemy是一个流行的Python ORM 对象关系映射 库 它允许我们以面向对象的方式管理数据库 在SQLAlchemy中 relationship 是一个重要的功能 用于建立表之间的关系 在本文中 我们将详细探讨 rel
  • 用CHAT分析高校体育智慧教学体系构建与探索研究现状

    CHAT回复 现阶段 高校体育智慧教学体系的构建与探索研究还处于初级阶段 但全球数字化转型大潮的推动下 一些较为前沿的研究和实践已经开始出现 1 教学平台的建设 很多高校已经开始尝试使用在线教育平台进行体育教学 把传统的面对面授课模式转变为
  • 电商数据api接口商品评论接口接入代码演示案例

    电商数据API接口商品评论 接口接入入口 提高用户体验 通过获取用户对商品的评论 商家可以了解用户对商品的满意度和需求 从而优化商品和服务 提高用户体验 提升销售业绩 用户在购买商品前通常会查看其他用户的评论 以了解商品的实际效果和质量 商
  • 软件测试|使用matplotlib绘制多种柱状图

    简介 在数据可视化领域 Matplotlib是一款强大的Python库 它可以用于创建多种类型的图表 包括柱状图 本文将介绍如何使用Matplotlib创建多种不同类型的柱状图 并提供示例代码 创建基本柱状图 首先 让我们创建一个基本的柱状
  • 基于java的学生成绩在线管理系统设计与实现

    基于java的学生成绩在线管理系统设计与实现 I 引言 A 研究背景和动机 基于Java的学生成绩在线管理系统设计与实现的研究背景和动机是设计一个可以方便管理学生成绩的系统 该系统可以方便地记录学生的成绩 并为老师和学生提供查询和统计功能
  • 基于java的物流信息网系统设计与实现

    基于java的物流信息网系统设计与实现 I 引言 A 研究背景和动机 基于Java的物流信息网系统设计与实现的研究背景和动机 随着互联网的普及和电子商务的快速发展 物流信息网系统已成为现代物流管理的重要组成部分 物流信息网系统能够实现物流信
  • 【计算机毕业设计】电影院订票信息管理系统

    当今社会已经步入了科学技术进步和经济社会快速发展的新时期 国际信息和学术交流也不断加强 计算机技术对经济社会发展和人民生活改善的影响也日益突出 人类的生存和思考方式也产生了变化 传统电影院订票采取了人工的管理方法 但这种管理方法存在着许多弊
  • 【无迹卡尔曼滤波】不确定和间接测量的非线性动力系统识别研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • Hutool改变我们的coding方式(二)

    Hutool改变我们的coding方式 Hutool 简介 Hutool如何改变我们的coding方式 文档 安装 Maven
  • 计算机Java项目|尤文图斯足球俱乐部网上商城系统

    作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智能与大数据 简历模板
  • 计算机Java项目|基于SSM的微课学习系统

    作者主页 编程指南针 作者简介 Java领域优质创作者 CSDN博客专家 CSDN内容合伙人 掘金特邀作者 阿里云博客专家 51CTO特邀作者 多年架构师设计经验 腾讯课堂常驻讲师 主要内容 Java项目 Python项目 前端项目 人工智
  • 最新整理Java面试八股文,大厂必备神器

    在此 我采访了数十名大厂的面试官和上百的的面试者 总结出了这一套Java面试八股文 这套八股文已经帮助了上百人拿到自己心仪的offer 我们先来看看这套八股文 Java基础面试八股文 操作系统中 heap 和 stack 的区别 什么是基于
  • 【自适应滤波】一种接近最佳的自适应滤波器,用于突发系统变化研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 详解toLowerCase(判断字符串相等)

    一 toLowerCase 函数简介 toLowerCase 是一个在多个编程语言中都存在的字符串方法 它的作用是将字符串中的所有大写字母转换为对应的小写字母 常用于文本处理 搜索和比较等情况 以确保字符串的一致性和非大小写敏感的操作 二
  • 【心电图基线估计和去噪方法的群稀疏正则化】带有群稀疏正则化的心电图基线估计和去噪(Matlab实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 2024年华为OD机试真题-查找接口成功率最优时间段-Python-OD统一考试(C卷)

    题目描述 服务之间交换的接口成功率作为服务调用关键质量特性 某个时间段内的接口失败率使用一个数组表示 数组中每个元素都是单位时间内失败率数值 数组中的数值为0 100的整数 给定一个数值 minAverageLost 表示某个时间段内平均失
  • Java开发中不要使用受检异常

    简介 Java是唯一 主流 实现了受检异常概念的编程语言 一开始 受检异常就是争议的焦点 在当时被视为一种创新概念 Java于1996年推出 如今却被视不良实践 本文要讨论Java中非受检异常和受检异常的动机以及它们优缺点 与大多数关注这个
  • 【安全】Java幂等性校验解决重复点击(6种实现方式)

    目录 一 简介 1 1 什么是幂等 1 2 为什么需要幂等性 1 3 接口超时 应该如何处理 1 4 幂等性对系统的影响 二 Restful API 接口的幂等性 三 实现方式 3 1 数据库层面 主键 唯一索引冲突 3 2 数据库层面 乐

随机推荐

  • 广告营销用户点击预测分析

    广告营销用户点击预测分析 零 数据集以及数据集简介以及任务分析 一 数据预处理 1 加载检查数据 1 特殊特征 2 特殊特征的处理 3 特殊特征处理后生成的新特征 2 数据类型与缺失值处理 1 查看数据信息 2 数据补全以及类型转换 3 补
  • 为什么 Thread 类的 sleep() 和 yield () 方法是静态方法?(详解)

    首先明确一点 在一个线程拿到锁的时候 其他线程向拿到锁就必须要等待 author FanQie date 2022 7 30 10 43 public class SleepYield private static Object resou
  • docker 运行pytorch 程序报错---ERROR: Unexpected bus error encountered in worker.

    1 错误 ERROR Unexpected bus error encountered in worker This might be caused by insufficient shared memory shm 2 原因 Pytorc
  • springboot项目部署云服务器,SpringBoot项目的云服务器部署

    1 场景还原 springboot配置相当简单 人人皆知 怎么把springboot工程部署到云服务器上呢 可能有人会说 博主你前篇不是讲了java工程的云部署把 但是我想澄清一点的是 我前篇的工程都是ssm框架搭建的 而springboo
  • 20个免费视频素材平台推荐

    视频剪辑大神的视频素材是从哪里找的 视频素材不知道去哪里找 那可以看看本文 本文总结了素材的方方面面 包括图片 图标以及视频音频的素材网站整理 再也无需为视频素材烦恼 1 新CG儿 一个特别良心的素材网站 模板和视频都非常丰富 重要的是基本
  • 蓝桥杯精选赛题算法系列——迷宫——DFS

    已收录此专栏 今天我们会全面学习 DFS 的相关知识 包括理论 模板 真题等 深度优先搜索 DFS Depth First Search 和宽度优先搜索 BFS Breadth First Search 或称为广度优先搜索 是基本的暴力技术
  • Apache Flink不止于计算,数仓架构或兴起新一轮变革

    2021 年初 在 InfoQ 编辑部策划的全年技术趋势展望中 我们提到大数据领域将加速拥抱 融合 或 一体化 演进的新方向 本质是为了降低大数据分析的技术复杂度和成本 同时满足对性能和易用性的更高要求 如今 我们看到流行的流处理引擎 Ap
  • electron globalShortcut 快捷键与系统全局快捷键冲突

    用 electron 开发自己的接口测试工具 Post Tools 在设置了 globalShortcut 快捷键后 发现应用中的快捷键与系统全局快捷键冲突了 导致系统快捷键不可正常使用 快捷键配置 export function init
  • GTest学习笔记(七)

    参考博客 Advanced googletest Topics GoogleTest 前言 参数化测试允许对代码进行多种输入的测试 而不需要复制很多相同的代码 本文主要介绍GTest的参数化测试的适用环境 编写方式以及参数化的抽象测试 1
  • 架构设计之道【精】

    一 本质 在了解架构本质之前先了解下架构的定义 百度百科对架构的定义 架构又名软件架构 是有关软件整体结构与组件的抽象描述 用于指导大型软件系统各个方面的设计 从定义中我们提炼出几个关键字 组件 结构 关系 组件 也可以称为软件元素或者是架
  • vscode 扩展开发从入门到颈椎病康复

    笔者从业以来 各路插件开发无算 而 vscode 把插件开发体验做到了极致 其开发体验 如沐春风 如丝般顺滑 经常写完了还想删掉再写一遍 vscode 扩展的内置脚手架细心且精致 一键生成后即可运行 vscode 库类型完美 因此开发者可以
  • Sentinel + Gateway网关动态限流

    Sentinel 控制台 0 概述 Sentinel 控制台是流量控制 熔断降级规则统一配置和管理的入口 它为用户提供了机器自发现 簇点链路自发现 监控 规则配置等功能 在 Sentinel 控制台上 我们可以配置规则并实时查看流量控制效果
  • python爬虫要用到的库_Python写爬虫都用到什么库

    Python爬虫 全称Python网络爬虫 是一种按照一定的规则 自动地抓取万维网信息的程序或脚本 主要用于抓取证券交易数据 天气数据 网站用户数据和图片数据等 Python为支持网络爬虫正常功能实现 内置了大量的库 主要有几种类型 下面本
  • 音频处理-2 WAV格式

    后续要将流量中的音频数据转为WAV格式文件 所以本节重点说下WAV格式 WAV文件是在PC机平台上很常见的 最经典的多媒体音频文件 最早于1991年8月出现在Windows 3 1操作系统上 文件扩展名为WAV 是WaveFom的简写 也称
  • MarkDown超级教程 Obsidian版_11.4

    date 2021 11 3 18 01 aliases Markdown教程 MD教程 tags Markdown 什么是 Markdown Markdown 是一款轻量级标记语言 不同于HTML Hypertext Markup Lan
  • 修改notebook的默认路径_Anaconda3修改jupyter_notebook打开的默认路径

    1 windows下 找到jupyter notebook配置文件jupyter notebook config py 默认安装在 C Users Administrator jupyter jupyter notebook config
  • GB28181协议EasyGBS国标视频云平台无法正常启动的排查步骤与解决方法

    EasyGBS国标视频云服务是基于国标GB T28181协议的视频能力平台 可实现的视频功能包括 实时监控直播 录像 检索与回看 语音对讲 云存储 告警 平台级联等功能 平台部署简单 可拓展性强 支持将接入的视频流进行全终端 全平台分发 分
  • upload-labs

    pass 01 先发一个后缀名为PHP的文件 发现不能上传 然后禁用js 说明 js就是所谓的客户端脚本语言 是一种在互联网浏览器 浏览器也称为Web客户端 因为它连接到Web服务器上 以下载页面 内部运行的计算机编程语言 普通网页内都会插
  • React新出来两个钩子函数是什么?和删掉的will系列有什么区别?

    React新出来两个钩子函数是什么 和删掉的will系列有什么区别 react16废弃的生命周期有3个will componentWillMount componentWillReceiveProps componentWillUpdate
  • SolidWorks二次开发语法技巧及基础

    语法 变量 HRESULT 接口返回值 用于异常调用时判断 本质 typedef LONG HRESULT 32位 S OK S FALSE OLECHAR 特定平台上表示文本数据 win32内 定义为 wchar t 16 或32 位 c